home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / SNNSV32.ZIP / SNNSv3.2 / xgui / sources / net_analyzer.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-25  |  67.7 KB  |  2,465 lines

  1. /*****************************************************************************
  2.   FILE           : net_analyzer.c
  3.   SHORTNAME      : net_analyzer.c 
  4.   SNNS VERSION   : 3.2
  5.  
  6.   PURPOSE        : a tool for analyzing neural networks
  7.   NOTES          :
  8.  
  9.   AUTHOR         : Tobias Soyez
  10.   DATE           : 09.11.1993
  11.  
  12.   CHANGED BY     : Michael Vogt, Guenter Mamier
  13.   IDENTIFICATION : @(#)net_analyzer.c    1.7 4/21/94
  14.   SCCS VERSION   : 1.7 
  15.   LAST CHANGE    : 4/21/94  
  16.  
  17.              Copyright (c) 1990-1994  SNNS Group, IPVR, Univ. Stuttgart, FRG
  18.  
  19. ******************************************************************************/
  20.  
  21.  
  22. #include <math.h>
  23. #include <stdio.h>
  24. #include <malloc.h>
  25.  
  26. #include <X11/Xlib.h>
  27. #include <X11/Xutil.h>
  28. #include <X11/Xos.h>
  29. #include <X11/cursorfont.h>
  30. #include <X11/Intrinsic.h>
  31. #include <X11/StringDefs.h>
  32. #include <X11/Shell.h>
  33. #include <X11/Xaw/Box.h>
  34. #include <X11/Xaw/Simple.h>
  35. #include <X11/Xaw/Grip.h>
  36. #include <X11/Xaw/Form.h>
  37. #include <X11/Xaw/SmeBSB.h>
  38. #include <X11/Xaw/SmeLine.h>
  39. #include <X11/Xaw/Viewport.h>
  40. #include <X11/Xaw/Label.h>
  41. #include <X11/Xaw/Toggle.h>
  42. #include <X11/Xaw/Command.h>
  43. #include <X11/Xaw/Cardinals.h>
  44. #include <X11/Xaw/AsciiText.h>
  45. #include <X11/Xaw/Scrollbar.h>
  46.  
  47. #include "kr_typ.h"
  48. #include "kr_const.h"
  49. #include "kr_def.h"
  50. #include "kr_mac.h"
  51. #include "kernel.h"
  52.  
  53. #include "ui.h"
  54. #include "ui_xWidgets.h"
  55. #include "ui_textP.h"
  56. #include "ui_main.h"
  57. #include "ui_mainP.h"
  58. #include "kr_ui.h"
  59. #include "ui_remote.h"
  60. #include "ui_remoteP.h"
  61.  
  62. #include "on2.xbm"
  63. #include "line.xbm"
  64. #include "grid.xbm"
  65. #include "clear.xbm"
  66. #include "m_test.xbm"
  67. #include "record.xbm"
  68. #include "setup.xbm"
  69. #include "done2.xbm"
  70.  
  71. #include "xy.xbm"
  72. #include "ty.xbm"
  73. #include "te.xbm"
  74. #include "e_lin.xbm"
  75. #include "e_sqr.xbm"
  76. #include "e_su.xbm"
  77. #include "ave.xbm"
  78. #include "act.xbm"
  79. #include "out.xbm"
  80. #include "cancel.xbm"
  81.  
  82. #include "dctrl.xbm"
  83. #include "half.xbm"
  84. #include "double.xbm"
  85. #include "left.xbm"
  86. #include "lleft.xbm"
  87. #include "right.xbm"
  88. #include "rright.xbm"
  89. #include "up2.xbm"
  90. #include "uup.xbm"
  91. #include "down2.xbm"
  92. #include "ddown.xbm"
  93.  
  94. #include "net_analyzer.ph"
  95.  
  96.  
  97.  
  98. /*****************************************************************************
  99.   FUNCTION : NA_CreateButtonItem
  100.  
  101.   PURPOSE  : creates a button item
  102.   RETURNS  : button widget
  103.   NOTES    :
  104.  
  105.   UPDATE   : 
  106. ******************************************************************************/
  107.  
  108. static Widget NA_CreateButtonItem (char   *name,
  109.                                  Widget  parent, Widget left, Widget top)
  110.  
  111. {
  112.   Cardinal  n ;
  113.   Arg       arg[15] ;
  114.  
  115.  
  116.   n=0 ;
  117.  
  118.   if (strcmp (name, "clear") == 0)
  119.   { 
  120.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  121.               XDefaultRootWindow (ui_display), clear_bits, clear_width,
  122.               clear_height)) ; n++ ;
  123.   }
  124.  
  125.   if (strcmp (name, "m_test") == 0)
  126.   { 
  127.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  128.               XDefaultRootWindow (ui_display), m_test_bits, m_test_width,
  129.               m_test_height)) ; n++ ;
  130.   }
  131.  
  132.   if (strcmp (name, "setup") == 0)
  133.   { 
  134.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  135.               XDefaultRootWindow (ui_display), setup_bits, setup_width,
  136.               setup_height)) ; n++ ;
  137.   }
  138.  
  139.   if (strcmp (name, "done2") == 0)
  140.   {
  141.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  142.               XDefaultRootWindow (ui_display), done2_bits, done2_width, 
  143.               done2_height)) ; n++ ;
  144.   }
  145.  
  146.   if (strcmp (name, "cancel") == 0)
  147.   { 
  148.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  149.               XDefaultRootWindow (ui_display), cancel_bits, cancel_width,
  150.               cancel_height)) ; n++ ;
  151.   }
  152.  
  153.   if (strcmp (name, "dctrl") == 0)
  154.   { 
  155.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  156.               XDefaultRootWindow (ui_display), dctrl_bits, dctrl_width,
  157.               dctrl_height)) ; n++ ;
  158.   }
  159.  
  160.   if (strcmp (name, "half") == 0)
  161.   { 
  162.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  163.               XDefaultRootWindow (ui_display), half_bits, half_width,
  164.               half_height)) ; n++ ;
  165.   }
  166.  
  167.   if (strcmp (name, "double") == 0)
  168.   { 
  169.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  170.               XDefaultRootWindow (ui_display), double_bits, double_width,
  171.               double_height)) ; n++ ;
  172.   }
  173.  
  174.   if (strcmp (name, "left") == 0)
  175.   { 
  176.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  177.               XDefaultRootWindow (ui_display), left_bits, left_width,
  178.               left_height)) ; n++ ;
  179.   }
  180.  
  181.   if (strcmp (name, "lleft") == 0)
  182.   { 
  183.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  184.               XDefaultRootWindow (ui_display), lleft_bits, lleft_width,
  185.               lleft_height)) ; n++ ;
  186.   }
  187.  
  188.   if (strcmp (name, "right") == 0)
  189.   { 
  190.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  191.               XDefaultRootWindow (ui_display), right_bits, right_width,
  192.               right_height)) ; n++ ;
  193.   }
  194.  
  195.   if (strcmp (name, "rright") == 0)
  196.   { 
  197.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  198.               XDefaultRootWindow (ui_display), rright_bits, rright_width,
  199.               rright_height)) ; n++ ;
  200.   }
  201.  
  202.   if (strcmp (name, "up2") == 0)
  203.   { 
  204.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  205.               XDefaultRootWindow (ui_display), up2_bits, up2_width,
  206.               up2_height)) ; n++ ;
  207.   }
  208.  
  209.   if (strcmp (name, "uup") == 0)
  210.   { 
  211.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  212.               XDefaultRootWindow (ui_display), uup_bits, uup_width,
  213.               uup_height)) ; n++ ;
  214.   }
  215.  
  216.   if (strcmp (name, "down2") == 0)
  217.   { 
  218.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  219.               XDefaultRootWindow (ui_display), down2_bits, down2_width,
  220.               down2_height)) ; n++ ;
  221.   }
  222.  
  223.   if (strcmp (name, "ddown") == 0)
  224.   { 
  225.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  226.               XDefaultRootWindow (ui_display), ddown_bits, ddown_width,
  227.               ddown_height)) ; n++ ;
  228.   }
  229.  
  230.   XtSetArg (arg[n], XtNborderWidth   , 0          ) ; n++ ;
  231.   XtSetArg (arg[n], XtNinternalHeight, 1          ) ; n++ ;
  232.   XtSetArg (arg[n], XtNinternalWidth , 1          ) ; n++ ;
  233.   XtSetArg (arg[n], XtNfromVert      , top        ) ; n++ ;
  234.   XtSetArg (arg[n], XtNfromHoriz     , left       ) ; n++ ;
  235.   XtSetArg (arg[n], XtNleft          , XtChainLeft) ; n++ ; 
  236.   XtSetArg (arg[n], XtNright         , XtChainLeft) ; n++ ;
  237.   XtSetArg (arg[n], XtNtop           , XtChainTop ) ; n++ ; 
  238.   XtSetArg (arg[n], XtNbottom        , XtChainTop ) ; n++ ;
  239.  
  240.   return (XtCreateManagedWidget (name, commandWidgetClass, parent, arg, n)) ;
  241. }
  242.  
  243.  
  244.  
  245. /*****************************************************************************
  246.   FUNCTION : NA_CreateToggleItem
  247.  
  248.   PURPOSE  : creates a toggle item
  249.   RETURNS  : toggle widget 
  250.   NOTES    :
  251.  
  252.   UPDATE   : 
  253. ******************************************************************************/
  254.  
  255. static Widget NA_CreateToggleItem (char *name, Widget parent, Widget group, 
  256.                                    Widget left, Widget top)
  257.  
  258.   Cardinal  n ; 
  259.   Arg       arg[15] ;
  260.  
  261.  
  262.   n=0 ;
  263.  
  264.   if (strcmp (name, "on2") == 0) 
  265.   { 
  266.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display, 
  267.               XDefaultRootWindow (ui_display), on2_bits, on2_width, 
  268.               on2_height)) ; n++ ; 
  269.   }
  270.  
  271.   if (strcmp (name, "line") == 0) 
  272.   { 
  273.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display, 
  274.               XDefaultRootWindow (ui_display), line_bits, line_width, 
  275.               line_height)) ; n++ ; 
  276.   }
  277.  
  278.   if (strcmp (name, "grid") == 0) 
  279.   { 
  280.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  281.               XDefaultRootWindow (ui_display), grid_bits, grid_width, 
  282.               grid_height)) ; n++ ; 
  283.   }
  284.  
  285.   if (strcmp (name, "m_test") == 0)
  286.   { 
  287.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  288.               XDefaultRootWindow (ui_display), m_test_bits, m_test_width,
  289.               m_test_height)) ; n++ ;
  290.   }
  291.  
  292.   if (strcmp (name, "record") == 0) 
  293.   { 
  294.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  295.               XDefaultRootWindow (ui_display), record_bits, record_width, 
  296.               record_height)) ; n++ ; 
  297.   }
  298.  
  299.   if (strcmp (name, "xy") == 0) 
  300.   { 
  301.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  302.               XDefaultRootWindow (ui_display), xy_bits, xy_width, 
  303.               xy_height)) ; n++ ; 
  304.   }
  305.  
  306.   if (strcmp (name, "ty") == 0) 
  307.   { 
  308.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  309.               XDefaultRootWindow (ui_display), ty_bits, ty_width, 
  310.               ty_height)) ; n++ ; 
  311.   }
  312.  
  313.   if (strcmp (name, "te") == 0) 
  314.   { 
  315.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  316.               XDefaultRootWindow (ui_display), te_bits, te_width, 
  317.               te_height)) ; n++ ; 
  318.   }
  319.  
  320.   if (strcmp (name, "e_lin") == 0) 
  321.   { 
  322.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  323.               XDefaultRootWindow (ui_display), e_lin_bits, e_lin_width, 
  324.               e_lin_height)) ; n++ ; 
  325.   }
  326.  
  327.   if (strcmp (name, "e_sqr") == 0) 
  328.   { 
  329.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  330.               XDefaultRootWindow (ui_display), e_sqr_bits, e_sqr_width, 
  331.               e_sqr_height)) ; n++ ; 
  332.   }
  333.  
  334.   if (strcmp (name, "e_su") == 0) 
  335.   { 
  336.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  337.               XDefaultRootWindow (ui_display), e_su_bits, e_su_width, 
  338.               e_su_height)) ; n++ ; 
  339.   }
  340.  
  341.   if (strcmp (name, "ave") == 0) 
  342.   { 
  343.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  344.               XDefaultRootWindow (ui_display), ave_bits, ave_width, 
  345.               ave_height)) ; n++ ; 
  346.   }
  347.  
  348.   if (strcmp (name, "act") == 0) 
  349.   { 
  350.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  351.               XDefaultRootWindow (ui_display), act_bits, act_width, 
  352.               act_height)) ; n++ ; 
  353.   }
  354.  
  355.   if (strcmp (name, "out") == 0) 
  356.   { 
  357.     XtSetArg (arg[n], XtNbitmap, (Pixmap) XCreateBitmapFromData (ui_display,
  358.               XDefaultRootWindow (ui_display), out_bits, out_width, 
  359.               out_height)) ; n++ ; 
  360.   }
  361.  
  362.  
  363.   XtSetArg (arg[n], XtNborderWidth   , 0          ) ; n++ ; 
  364.   XtSetArg (arg[n], XtNinternalHeight, 1          ) ; n++ ; 
  365.   XtSetArg (arg[n], XtNinternalWidth , 1          ) ; n++ ; 
  366.   XtSetArg (arg[n], XtNfromVert      , top        ) ; n++ ; 
  367.   XtSetArg (arg[n], XtNfromHoriz     , left       ) ; n++ ; 
  368.   XtSetArg (arg[n], XtNleft          , XtChainLeft) ; n++ ; 
  369.   XtSetArg (arg[n], XtNright         , XtChainLeft) ; n++ ;
  370.   XtSetArg (arg[n], XtNtop           , XtChainTop ) ; n++ ; 
  371.   XtSetArg (arg[n], XtNbottom        , XtChainTop ) ; n++ ; 
  372.   XtSetArg (arg[n], XtNradioGroup    , group      ) ; n++ ;
  373.  
  374.   return (XtCreateManagedWidget (name, toggleWidgetClass, parent, arg, n)) ;
  375. }
  376.  
  377.  
  378.  
  379. /*****************************************************************************
  380.   FUNCTION : NA_ResetNetworkAnalyzer
  381.  
  382.   PURPOSE  : initializes global variables
  383.   RETURNS  : void
  384.   NOTES    :
  385.  
  386.   UPDATE   : 
  387. ******************************************************************************/
  388.  
  389. static void NA_ResetNetworkAnalyzer (void) 
  390.  
  391. {
  392.   na.window.x       =   0 ;
  393.   na.window.y       =   0 ;
  394.   na.window.w       = 300 ;
  395.   na.window.h       = 150 ;
  396.  
  397.   na.pixmap.x       =   0 ;
  398.   na.pixmap.y       =   0 ;
  399.   na.pixmap.w       = 300 ;
  400.   na.pixmap.h       = 150 ;
  401.  
  402.   na.graphtype      = NA_GRAPH_TE  ;
  403.   na.error          = NA_ERROR_SQR ;
  404.   na.error_unit     = 0 ;
  405.   na.ave            = FALSE ;
  406.   na.m_test         = 10 ;
  407.   na.period         = 1  ;
  408.  
  409.   na.hor.min        =   1.0 ;
  410.   na.hor.max        = 100.0 ;
  411.   na.hor.factor     = (float) na.graph.w / (float) (na.hor.max-na.hor.min) ;
  412.   na.hor.unit_no    = 0  ; 
  413.   na.hor.grid       = 10 ;
  414.   na.hor.out        = TRUE ;
  415.  
  416.   na.ver.min        = 0.0 ;
  417.   na.ver.max        = 1.0 ;
  418.   na.ver.factor     = (float) na.graph.h / (float) (na.ver.max-na.ver.min) ;
  419.   na.ver.unit_no    = 0  ; 
  420.   na.ver.grid       = 10 ;
  421.   na.ver.out        = TRUE ;
  422.  
  423.   na.toggles.on     = FALSE ;
  424.   na.toggles.line   = TRUE  ;     
  425.   na.toggles.grid   = FALSE ;     
  426.   na.toggles.record = FALSE ;     
  427.  
  428.   na.gd.time        = 1  ; 
  429.   na.gd.i           = 0  ;
  430.   na.gd.no_data     = TRUE  ;
  431.   na.gd.wrapped     = FALSE ;
  432.   na.rec_file       = (FILE *) NULL ;
  433.  
  434.   strcpy (na.rec_filename, "./SNNS_REC") ;
  435.  
  436.   strcpy (info_line, "\n") ;
  437. }
  438.  
  439.  
  440. /*****************************************************************************
  441.   FUNCTION : NA_NetworkAnalyzerIsOpen 
  442.  
  443.   PURPOSE  : returns true if the network analyzer widget is open, else false
  444.   NOTES    :
  445.  
  446.   UPDATE   : 
  447. ******************************************************************************/
  448.  
  449. Bool NA_NetworkAnalyzerIsOpen (void)
  450.  
  451. {
  452.   return (na_Open == 1) ;
  453. }
  454.  
  455.  
  456.  
  457. /*****************************************************************************
  458.   FUNCTION : NA_Error
  459.  
  460.   PURPOSE  : calculates the error
  461.   RETURNS  : float value of the error
  462.   NOTES    :
  463.  
  464.   UPDATE   : 
  465. ******************************************************************************/
  466.  
  467. static float NA_Error (void)
  468.  
  469. {
  470. #if 0
  471.   register struct   Unit *unit_ptr, *error_unit_ptr ;
  472.   register Patterns       out_pat  ;
  473.   register float          error_lin, error_sqr, error_su, devit ;
  474.  
  475.  
  476.   out_pat = out_patterns + (ui_noOfCurrentPattern - 1) * NoOfOutputPatterns ;
  477.  
  478.   error_lin = 0 ;
  479.   error_sqr= 0 ;
  480.   error_su  = 0 ;
  481.  
  482.   if (na.error_unit != 0)
  483.     error_unit_ptr = kr_getUnitPtr (na.error_unit) ;
  484.     
  485.   FOR_ALL_UNITS (unit_ptr)
  486.   {
  487.     if (IS_OUTPUT_UNIT (unit_ptr))
  488.     {
  489.       devit = (float) (*(out_pat++) - unit_ptr->Out.output) ;
  490.       error_lin += fabs (devit) ;
  491.       error_sqr += devit * devit ;  
  492.  
  493.       if (unit_ptr == error_unit_ptr) error_su = fabs (devit) ;
  494.     }
  495.   }
  496.  
  497.   switch (na.error)
  498.   {
  499.     case NA_ERROR_LIN : 
  500.     {
  501.       if (na.ave) return (error_lin / (float) NoOfOutputPatterns);
  502.       else        return (error_lin) ; 
  503.       break ; 
  504.     }
  505.  
  506.     case NA_ERROR_SQR : 
  507.     {
  508.       if (na.ave) return (error_sqr / (float) NoOfOutputPatterns);
  509.       else        return (error_sqr) ;
  510.       break ; 
  511.     }
  512.  
  513.     case NA_ERROR_SU :
  514.     {
  515.       return (error_su) ;
  516.       break ;
  517.     }
  518.   }
  519. #endif
  520. }
  521.  
  522.  
  523.  
  524. /*****************************************************************************
  525.   FUNCTION : NA_OpenRecordFile
  526.  
  527.   PURPOSE  : opens the record file
  528.   RETURNS  : void
  529.   NOTES    :
  530.  
  531.   UPDATE   : 
  532. ******************************************************************************/
  533.  
  534. static void NA_OpenRecordFile (void)
  535.  
  536. {
  537.   char buf[80] ;
  538.  
  539.  
  540.   sprintf (buf, "%s.rec", na.rec_filename) ;
  541.  
  542.   if ((na.rec_file = fopen (buf, "a")) == (FILE *) NULL)
  543.   {
  544.     ui_confirmOk ("can't open file") ;
  545.     fclose (na.rec_file) ; 
  546.     ui_xSetToggleState (t_Record, FALSE) ; 
  547.     na.toggles.record = FALSE ;
  548.   }
  549.   else
  550.   {
  551.     NA_WriteToRecordFile (info_line) ;
  552.   }
  553. }
  554.  
  555.  
  556.  
  557. /*****************************************************************************
  558.   FUNCTION : NA_CloseRecordFile
  559.  
  560.   PURPOSE  : closes the record file
  561.   RETURNS  : void
  562.   NOTES    :
  563.  
  564.   UPDATE   : 
  565. ******************************************************************************/
  566.  
  567. static void NA_CloseRecordFile (void)
  568.  
  569. {
  570.   fclose (na.rec_file) ; 
  571. }
  572.  
  573.  
  574.  
  575. /*****************************************************************************
  576.   FUNCTION : NA_WriteToRecordFile
  577.  
  578.   PURPOSE  : writes a string into the record file
  579.   RETURNS  : void
  580.   NOTES    :
  581.  
  582.   UPDATE   : 
  583. ******************************************************************************/
  584.  
  585. static void NA_WriteToRecordFile (char *str) 
  586.  
  587. {
  588.   if (na.toggles.record) fprintf (na.rec_file, str) ;
  589. }
  590.  
  591.  
  592.  
  593. /*############################################################################
  594.  
  595.                     D R A W I N G     F U N C T I O N S 
  596.  
  597. ############################################################################*/
  598.  
  599.  
  600. /*****************************************************************************
  601.   FUNCTION : NA_DrawCS 
  602.  
  603.   PURPOSE  : draws the coordinate system 
  604.   RETURNS  : void 
  605.   NOTES    :
  606.  
  607.   UPDATE   : 
  608. ******************************************************************************/
  609.  
  610. static void NA_DrawCS (void) 
  611.  
  612. {
  613.   char  buf[40]   ;
  614.   int   i, y, x   ;
  615.   int   dist, len ;
  616.   float f ;
  617.  
  618.   
  619.   XDrawRectangle (na_Display, na_Pixmap, na_GC, na.graph.x, na.graph.y,
  620.                   na.graph.w, na.graph.h) ;
  621.  
  622.  
  623.   /* --------------------  draw horizontal labels  ------------------------- */
  624.  
  625.   dist = 100 ;
  626.  
  627.   for (i = 0 ; i < na.hor.grid ; i++)
  628.   {
  629.     x   = (int) ((float) (i * na.graph.w)  / (float) na.hor.grid) ;
  630.     len = 3 ;
  631.  
  632.     if ((dist > 40) && (x < na.graph.w - 35)) 
  633.     {
  634.       f = (float) i / (float) na.hor.grid * (na.hor.max - na.hor.min) 
  635.           + na.hor.min ;
  636.  
  637.       if (f < 10000.0) sprintf (buf, "%6.5f", f) ;
  638.       else             sprintf (buf, "%6d"  , (int) f) ;
  639.  
  640.       XDrawString (na_Display, na_Pixmap, na_GC, na.graph.x - 18 + x, 
  641.                    na.graph.y + na.graph.h + 14, buf, 6) ;
  642.       len += 2 ;
  643.       dist = 0 ;
  644.     }
  645.  
  646.     XDrawLine (na_Display, na_Pixmap, na_GC, na.graph.x + x, 
  647.                na.graph.y + na.graph.h + len,
  648.                na.graph.x + x, na.graph.y + na.graph.h ) ;
  649.  
  650.     dist += (int) ((float) na.graph.w / (float) na.hor.grid) ;
  651.   }
  652.  
  653.   if (na.hor.max < 10000.0) sprintf (buf, "%6.5f", na.hor.max) ;
  654.   else                      sprintf (buf, "%6d"  , (int) na.hor.max) ;
  655.  
  656.   XDrawString (na_Display, na_Pixmap, na_GC, na.graph.x + na.graph.w - 18, 
  657.                na.graph.y + na.graph.h + 14, buf, 6) ;
  658.  
  659.   XDrawLine   (na_Display, na_Pixmap, na_GC, 
  660.                na.graph.x + na.graph.w, na.graph.y + na.graph.h, 
  661.                na.graph.x + na.graph.w, na.graph.y + na.graph.h + 5) ;
  662.  
  663.  
  664.  
  665.   /* ---------------------  draw vertical labels  ------------------------- */
  666.  
  667.   dist = 100 ;
  668.  
  669.   for (i = 0 ; i < na.ver.grid ; i++)
  670.   {
  671.     y   = (int) ((float) (i * na.graph.h)  / (float) na.ver.grid) ;
  672.     len = 3 ;
  673.  
  674.     if ((dist > 10) && (y < na.graph.h - 10 ))
  675.     {
  676.       f = (float) i / (float) na.ver.grid * (na.ver.max - na.ver.min) 
  677.           + na.ver.min ;
  678.  
  679.       if (f < 10000.0) sprintf (buf, "%6.5f", f) ;
  680.       else             sprintf (buf, "%6d"  , (int) f) ;
  681.  
  682.       XDrawString (na_Display, na_Pixmap, na_GC, 4, 
  683.                    na.graph.y + na.graph.h + 4 - y, buf, 6) ;
  684.       len += 2 ;
  685.       dist = 0 ;
  686.     }
  687.  
  688.     XDrawLine (na_Display, na_Pixmap, na_GC, 
  689.                na.graph.x - len, na.graph.y + na.graph.h - y,
  690.                na.graph.x      , na.graph.y + na.graph.h - y) ;
  691.  
  692.     dist += (int) ((float) na.graph.h / (float) na.ver.grid) ; 
  693.   }
  694.  
  695.   if (na.ver.max < 10000.0) sprintf (buf, "%6.5f", na.ver.max) ;
  696.   else                      sprintf (buf, "%6d"  , (int) na.ver.max) ;
  697.  
  698.   XDrawString (na_Display, na_Pixmap, na_GC, 4, na.graph.y + 4, buf, 6) ;
  699.  
  700.   XDrawLine   (na_Display, na_Pixmap, na_GC, na.graph.x - 5, na.graph.y,
  701.                na.graph.x, na.graph.y) ;
  702. }
  703.  
  704.  
  705.  
  706. /*****************************************************************************
  707.   FUNCTION : NA_DrawInfo
  708.  
  709.   PURPOSE  : displays information about the axis 
  710.   RETURNS  : void 
  711.   NOTES    :
  712.  
  713.   UPDATE   : 
  714. ******************************************************************************/
  715.  
  716. static void NA_DrawInfo (void)
  717.  
  718.   int          info_x, info_y ;
  719.   char         buf1[256], buf2[256], info[1024] ;
  720.  
  721.   
  722.   info_x = 0 ;
  723.   info_y = na.pixmap.h - INFO_BORDER ;
  724.  
  725.   XDrawLine (na_Display, na_Pixmap, na_GC, 0, info_y, na.pixmap.w, info_y) ;
  726.  
  727.   if (na.graphtype == NA_GRAPH_XY) 
  728.   {
  729.     if (na.hor.out) 
  730.       sprintf (buf1, "horizontal : output of unit no. %d", 
  731.                na.hor.unit_no) ;
  732.     else        
  733.       sprintf (buf1, "horizontal : activation of unit no. %d", 
  734.                na.hor.unit_no) ;
  735.   }
  736.   else
  737.     sprintf (buf1, "horizontal : time") ;
  738.  
  739.   XDrawString (na_Display, na_Pixmap, na_GC, info_x + 7, info_y + 11, 
  740.                buf1, strlen(buf1)) ;
  741.  
  742.   if (na.graphtype == NA_GRAPH_TE)
  743.   {
  744.     switch (na.error)
  745.     {
  746.       case NA_ERROR_LIN : 
  747.         if (na.ave)
  748.           strcpy  (buf2, "vertical   : error (lin ave)") ; 
  749.         else
  750.           strcpy  (buf2, "vertical   : error (lin)") ; break ;
  751.       case NA_ERROR_SQR : 
  752.         if (na.ave)
  753.           strcpy  (buf2, "vertical   : error (sqr ave)") ; 
  754.         else
  755.           strcpy  (buf2, "vertical   : error (sqr)") ; break ;
  756.       case NA_ERROR_SU  : 
  757.         sprintf   (buf2, "vertical   : error of output unit no. %d",
  758.                  na.error_unit) ; 
  759.         break ;
  760.     } 
  761.   }
  762.   else
  763.   {
  764.     if (na.ver.out) 
  765.       sprintf (buf2, "vertical   : output of unit no. %d", 
  766.                na.ver.unit_no) ;
  767.     else           
  768.       sprintf (buf2, "vertical   : activation of unit no. %d", 
  769.                na.ver.unit_no) ;
  770.   }
  771.  
  772.   XDrawString (na_Display, na_Pixmap, na_GC, info_x + 7, info_y + 21, 
  773.                buf2, strlen(buf2)) ;
  774.  
  775.   sprintf (info, "# %s # %s #\n", buf1, buf2) ;
  776.  
  777.   if (strcmp (info_line, info) != 0)
  778.   {
  779.     strcpy (info_line, info) ;
  780.     if (na.toggles.record) NA_WriteToRecordFile (info_line) ;
  781.     NA_ClearGraph () ;
  782.   }
  783. }
  784.  
  785.  
  786.  
  787. /*****************************************************************************
  788.   FUNCTION : NA_DrawPoint
  789.  
  790.   PURPOSE  : draws a single point into the network analyzer pixmap
  791.              if mode = NA_DRAW_WINDOW then the point will be drawn into the 
  792.              window, too
  793.   RETURNS  : void
  794.   NOTES    :
  795.  
  796.   UPDATE   : 
  797. ******************************************************************************/
  798.  
  799. static void NA_DrawPoint (int i2, int mode)
  800.  
  801. {
  802.   int i1, x1, y1, x2, y2 ;
  803.  
  804.  
  805.   x2 = na.graph.x + (int) ((na.gd.x[i2] - na.hor.min) * na.hor.factor) ;
  806.   y2 = na.graph.y + 
  807.        na.graph.h - (int) ((na.gd.y[i2] - na.ver.min) * na.ver.factor) ;
  808.  
  809.   if (na.gd.lineflag[i2])
  810.   {
  811.     i1 = (i2 - 1 + MAX_ARRAY_SIZE) % MAX_ARRAY_SIZE ;
  812.  
  813.     x1 = na.graph.x + (int) ((na.gd.x[i1] - na.hor.min) * na.hor.factor) ;
  814.     y1 = na.graph.y + 
  815.          na.graph.h - (int) ((na.gd.y[i1] - na.ver.min) * na.ver.factor) ;
  816.  
  817.     XDrawLine  (na_Display, na_Pixmap, na_GC, x1, y1, x2, y2) ;
  818.  
  819.     if (mode == NA_DRAW_WINDOW)
  820.       XDrawLine  (na_Display, na_Window, na_GC, x1, y1, x2, y2) ;
  821.   }
  822.   else
  823.   {
  824.     XDrawPoint (na_Display, na_Pixmap, na_GC, x2, y2) ;
  825.  
  826.     if (mode == NA_DRAW_WINDOW)
  827.       XDrawPoint (na_Display, na_Window, na_GC, x2, y2) ;
  828.   }
  829.  
  830.   XDrawArc (na_Display, na_Pixmap, na_GC, x2-1, y2-1, 3, 3, 0, 359*64) ;
  831.  
  832.   if (mode == NA_DRAW_WINDOW)
  833.     XDrawArc (na_Display, na_Window, na_GC, x2-1, y2-1, 3, 3, 0, 359*64) ;
  834.  
  835. }
  836.  
  837.  
  838.  
  839. /*****************************************************************************
  840.   FUNCTION : NA_DrawGraph
  841.  
  842.   PURPOSE  : draws the graph  
  843.   RETURNS  : void 
  844.   NOTES    :
  845.  
  846.   UPDATE   : 
  847. ******************************************************************************/
  848.  
  849. static void NA_DrawGraph (void) 
  850.  
  851. {
  852.   int  j , i, no_of_points ;
  853.  
  854.  
  855.   if (na.gd.wrapped)
  856.   {
  857.     no_of_points = MAX_ARRAY_SIZE ;
  858.     i = na.gd.i ;
  859.   }
  860.   else
  861.   {
  862.     no_of_points = na.gd.i ;
  863.     i = 0 ;
  864.   }
  865.  
  866.   for (j = 0 ; j < no_of_points ; j ++) 
  867.   {
  868.     NA_DrawPoint (i, NA_DRAW_PIXMAP) ;
  869.     i = (i + 1) % MAX_ARRAY_SIZE ;
  870.   }
  871. }
  872.  
  873.  
  874.  
  875. /*****************************************************************************
  876.   FUNCTION : NA_DrawGrid
  877.  
  878.   PURPOSE  : draws the grid (only in the window !)
  879.   RETURNS  : void 
  880.   NOTES    :
  881.  
  882.   UPDATE   : 
  883. ******************************************************************************/
  884.  
  885. static void NA_DrawGrid (void) 
  886.  
  887. {
  888.   int  x, y, i, j ;
  889.  
  890.  
  891.   for  (i = 1 ; i < na.hor.grid ; i++)
  892.   {
  893.     x = (int) ((float) (i * na.graph.w) / (float) na.hor.grid) ;
  894.  
  895.     for (j = 0 ; j <= na.graph.h ; j += 3) 
  896.     {
  897.       XDrawPoint (na_Display, na_Window, na_GC, 
  898.                   na.graph.x + x, na.graph.y + na.graph.h - j) ;
  899.     }
  900.   }
  901.  
  902.   for (i = 1 ; i < na.ver.grid ; i++)
  903.   {
  904.     y = (int) ((float) (i * na.graph.h) / (float) na.ver.grid) ;
  905.  
  906.     for (j = 0 ; j <= na.graph.w ; j += 3)
  907.     {
  908.       XDrawPoint (na_Display, na_Window, na_GC, 
  909.                   na.graph.x + j, na.graph.y + na.graph.h - y) ;
  910.     }
  911.   }
  912. }
  913.  
  914.  
  915.  
  916. /*****************************************************************************
  917.   FUNCTION : NA_ClearGraph
  918.  
  919.   PURPOSE  : clears the graph in the window and in the pixmap
  920.   RETURNS  : void 
  921.   NOTES    :
  922.  
  923.   UPDATE   : 
  924. ******************************************************************************/
  925.  
  926. static void NA_ClearGraph (void)
  927.  
  928. {
  929.   NA_StopTest () ;
  930.  
  931.   XSetForeground (na_Display, na_GC, WhitePixel (na_Display, na_Screen)) ;
  932.   XFillRectangle (na_Display, na_Pixmap, na_GC, na.graph.x + 1, na.graph.y + 1,
  933.                   na.graph.w - 1, na.graph.h - 1);
  934.   XSetForeground (na_Display, na_GC, BlackPixel (na_Display, na_Screen)) ;
  935.  
  936.   XClearArea (na_Display, na_Window, na.graph.x + 1, na.graph.y + 1, 
  937.               na.graph.w - 1, na.graph.h - 1, 0) ;
  938.  
  939.   na.gd.time        = 1 ;
  940.   na.gd.i           = 0     ;
  941.   na.gd.no_data     = TRUE  ;
  942.   na.gd.wrapped     = FALSE ;
  943.   na.gd.lineflag[0] = FALSE ;
  944.  
  945.   if (na.toggles.grid) NA_DrawGrid () ;
  946. }
  947.  
  948.  
  949.  
  950. /*****************************************************************************
  951.   FUNCTION : NA_RedrawPixmap
  952.  
  953.   PURPOSE  : redraws the pixmap, but NOT the window 
  954.   RETURNS  : void 
  955.   NOTES    :
  956.  
  957.   UPDATE   : 
  958. ******************************************************************************/
  959.  
  960. static void NA_RedrawPixmap (void)
  961.  
  962. {
  963.   XRectangle  clip_recs[1] ;
  964.  
  965.  
  966.   clip_recs[0].x      = (short) 0 ;
  967.   clip_recs[0].y      = (short) 0 ;
  968.   clip_recs[0].width  = (unsigned short) na.pixmap.w ;
  969.   clip_recs[0].height = (unsigned short) na.pixmap.h ;
  970.  
  971.   XSetClipRectangles (na_Display, na_GC, 0, 0, clip_recs, 1, Unsorted) ;   
  972.  
  973.   XSetForeground (na_Display, na_GC, WhitePixel (na_Display, na_Screen)) ;
  974.   XFillRectangle (na_Display, na_Pixmap, na_GC, 0, 0, 
  975.                   na.pixmap.w, na.pixmap.h) ;
  976.   XSetForeground (na_Display, na_GC, BlackPixel (na_Display, na_Screen)) ;
  977.  
  978.   XDrawRectangle (na_Display, na_Pixmap, na_GC, 0, 0,
  979.                   na.pixmap.w  - 1, na.pixmap.h - 1) ;
  980.  
  981.   NA_DrawCS    () ;
  982.   NA_DrawInfo  () ;
  983.  
  984.   clip_recs[0].x      = (short)          na.graph.x ;
  985.   clip_recs[0].y      = (short)          na.graph.y ;
  986.   clip_recs[0].width  = (unsigned short) na.graph.w ;
  987.   clip_recs[0].height = (unsigned short) na.graph.h ;
  988.  
  989.   XSetClipRectangles (na_Display, na_GC, 0, 0, clip_recs, 1, Unsorted) ;   
  990.  
  991.   NA_DrawGraph () ;
  992. }
  993.  
  994.  
  995.  
  996. /*****************************************************************************
  997.   FUNCTION : NA_ShowPixmap
  998.  
  999.   PURPOSE  : copies the pixmap into the window 
  1000.   RETURNS  : void 
  1001.   NOTES    :
  1002.  
  1003.   UPDATE   : 
  1004. ******************************************************************************/
  1005.  
  1006. static void NA_ShowPixmap (void)
  1007.  
  1008. {
  1009.   XRectangle  clip_recs[1] ;
  1010.  
  1011.  
  1012.   clip_recs[0].x      = (short) 0 ;
  1013.   clip_recs[0].y      = (short) 0 ;
  1014.   clip_recs[0].width  = (unsigned short) na.pixmap.w ;
  1015.   clip_recs[0].height = (unsigned short) na.pixmap.h ;
  1016.  
  1017.   XSetClipRectangles (na_Display, na_GC, 0, 0, clip_recs, 1, Unsorted) ;   
  1018.  
  1019.   XClearArea (na_Display, na_Window, 0, 0, na.pixmap.w, na.pixmap.h, 0) ;
  1020.  
  1021.   XCopyArea  (na_Display, na_Pixmap, na_Window, na_GC, 0, 0,
  1022.               na.pixmap.w, na.pixmap.h, 0, 0) ;
  1023.  
  1024.   clip_recs[0].x      = (short)          na.graph.x ;
  1025.   clip_recs[0].y      = (short)          na.graph.y ;
  1026.   clip_recs[0].width  = (unsigned short) na.graph.w ;
  1027.   clip_recs[0].height = (unsigned short) na.graph.h ;
  1028.  
  1029.   XSetClipRectangles (na_Display, na_GC, 0, 0, clip_recs, 1, Unsorted) ;   
  1030.  
  1031.   if (na.toggles.grid) NA_DrawGrid () ;
  1032. }
  1033.  
  1034.  
  1035.  
  1036. /*****************************************************************************
  1037.   FUNCTION : NA_DrawNextPoint
  1038.  
  1039.   PURPOSE  : gets the next point and updates the graph
  1040.   RETURNS  : void
  1041.   NOTES    :
  1042.  
  1043.   UPDATE   : 
  1044. ******************************************************************************/
  1045.  
  1046. void NA_DrawNextPoint (void)
  1047.  
  1048. {
  1049.   char         buf[80]  ;
  1050.   struct Unit *unit_ptr ;
  1051.  
  1052.  
  1053.   if (! NA_NetworkAnalyzerIsOpen()) return ;
  1054.   if (! na.toggles.on)              return ;
  1055.  
  1056.  
  1057.   /* ---------------------------  check units  ----------------------------- */
  1058.  
  1059.   if (na.graphtype == NA_GRAPH_XY)
  1060.   {
  1061.     if ((na.hor.unit_no < 1) || (na.hor.unit_no > krui_getNoOfUnits()))
  1062.     {
  1063.       ui_confirmOk ("x : illegal unit no.")   ;
  1064.       na.toggles.on = FALSE ;
  1065.       ui_xSetToggleState (t_On, FALSE) ;
  1066.       return ;
  1067.     }
  1068.   }
  1069.  
  1070.   if (na.graphtype != NA_GRAPH_TE)
  1071.   {
  1072.     if ((na.ver.unit_no < 1) || (na.ver.unit_no > krui_getNoOfUnits()))
  1073.     {
  1074.       ui_confirmOk ("y : illegal unit no.") ; 
  1075.       na.toggles.on = FALSE ;
  1076.       ui_xSetToggleState (t_On, FALSE) ;
  1077.       return ;
  1078.     }
  1079.   }
  1080.   else  
  1081.   {
  1082.     if (na.error == NA_ERROR_SU)
  1083.     {
  1084.       if ((unit_ptr = kr_getUnitPtr (na.error_unit)) == NULL) 
  1085.       {
  1086.         ui_confirmOk ("unit j : illegal output unit no.") ;
  1087.         na.toggles.on = FALSE ;
  1088.         ui_xSetToggleState (t_On, FALSE) ;
  1089.         return ;
  1090.       }
  1091.  
  1092.       if (! IS_OUTPUT_UNIT (unit_ptr))
  1093.       {
  1094.         ui_confirmOk ("unit j : illegal output unit no.") ;
  1095.         na.toggles.on = FALSE ;
  1096.         ui_xSetToggleState (t_On, FALSE) ;
  1097.         return ;
  1098.       }
  1099.     }
  1100.   }
  1101.  
  1102.  
  1103.   /* -------------------------  get values  -------------------------- */
  1104.  
  1105.   if (na.graphtype == NA_GRAPH_XY)
  1106.   {
  1107.     if (na.hor.out) 
  1108.       na.gd.x[na.gd.i] = (float) krui_getUnitOutput     (na.hor.unit_no) ;
  1109.     else            
  1110.       na.gd.x[na.gd.i] = (float) krui_getUnitActivation (na.hor.unit_no) ;
  1111.  
  1112.   }
  1113.   else
  1114.   {
  1115.     na.gd.x[na.gd.i] = (float) na.gd.time ;
  1116.     na.gd.time++ ;
  1117.   }
  1118.  
  1119.   if (na.graphtype == NA_GRAPH_TE)
  1120.   {
  1121.     na.gd.y[na.gd.i] = NA_Error () ;
  1122.   }
  1123.   else
  1124.   {
  1125.     if (na.ver.out) 
  1126.       na.gd.y[na.gd.i] = (float) krui_getUnitOutput     (na.ver.unit_no) ;
  1127.     else            
  1128.       na.gd.y[na.gd.i] = (float) krui_getUnitActivation (na.ver.unit_no) ;
  1129.   }
  1130.  
  1131.   if ((na.toggles.line) && (!na.gd.no_data)) 
  1132.     na.gd.lineflag[na.gd.i] = True ;
  1133.  
  1134.   NA_DrawPoint (na.gd.i, NA_DRAW_WINDOW) ;
  1135.  
  1136.   if (na.toggles.record)
  1137.   { 
  1138.     sprintf (buf, "%-10f %-10f\n", na.gd.x[na.gd.i], na.gd.y[na.gd.i]) ;
  1139.     NA_WriteToRecordFile (buf) ;
  1140.   }
  1141.  
  1142.   na.gd.i = (na.gd.i + 1) % MAX_ARRAY_SIZE ;
  1143.  
  1144.   na.gd.no_data           = FALSE ;
  1145.   na.gd.lineflag[na.gd.i] = FALSE ;  
  1146.  
  1147.   if (na.gd.i == 0) na.gd.wrapped = TRUE ;
  1148. }
  1149.  
  1150.  
  1151.  
  1152. /*############################################################################
  1153.  
  1154.            N E T W O R K - A N A L Y Z E R       F U N C T I O N S 
  1155.  
  1156. ############################################################################*/
  1157.  
  1158.  
  1159. /*****************************************************************************
  1160.   FUNCTION : NA_ResizeWindow
  1161.  
  1162.   PURPOSE  : resizes the network analyzer widget
  1163.   RETURNS  : void
  1164.   NOTES    :
  1165.  
  1166.   UPDATE   : 
  1167. ******************************************************************************/
  1168.  
  1169. static void NA_ResizeWindow () 
  1170.  
  1171. {
  1172.   Cardinal   n ;
  1173.   Arg        args[10] ;
  1174.  
  1175.   int        s_hor, s_ver, b_hor, b_ver ;
  1176.   Dimension  w_width, w_height, b_width ;
  1177.  
  1178.  
  1179.   n = 0 ;
  1180.   XtSetArg    (args[n], XtNwidth  , &w_width ) ; n++ ;
  1181.   XtSetArg    (args[n], XtNheight , &w_height) ; n++ ;
  1182.   XtGetValues (w_Window, args, n) ;
  1183.  
  1184.   na.window.w = (unsigned int) w_width  ;
  1185.   na.window.h = (unsigned int) w_height ;
  1186.  
  1187.   n = 0 ;
  1188.   XtSetArg    (args[n], XtNhorizDistance, &s_hor) ; n++ ;
  1189.   XtSetArg    (args[n], XtNvertDistance , &s_ver) ; n++ ;
  1190.   XtGetValues (w_Screen, args, n) ;
  1191.  
  1192.   n = 0 ;
  1193.   XtSetArg    (args[n], XtNwidth         , &b_width) ; n++ ;
  1194.   XtSetArg    (args[n], XtNhorizDistance , &b_hor  ) ; n++ ;
  1195.   XtSetArg    (args[n], XtNvertDistance  , &b_ver  ) ; n++ ;
  1196.   XtGetValues (w_Buttons, args, n) ;
  1197.  
  1198.   na.pixmap.w = na.window.w - 1 * s_hor - (int) b_width - 2 * b_hor ;
  1199.   na.pixmap.h = na.window.h - 2 * s_ver ;
  1200.  
  1201.   na.graph.x = 50  ;
  1202.   na.graph.y = 10  ;
  1203.   na.graph.w = na.pixmap.w - na.graph.x - 20 ;
  1204.   na.graph.h = na.pixmap.h - na.graph.y - INFO_BORDER - 20 ;
  1205.  
  1206.   na_Pixmap = XCreatePixmap (na_Display, na_Window, na.pixmap.w, na.pixmap.h,
  1207.                              (unsigned int) na_Depth) ;
  1208.  
  1209.   na.hor.factor = (float) (na.graph.w) / (float) (na.hor.max - na.hor.min) ;
  1210.   na.ver.factor = (float) (na.graph.h) / (float) (na.ver.max - na.ver.min) ;
  1211.  
  1212.   XtResizeWidget (w_Screen, na.pixmap.w, na.pixmap.h, 0) ;
  1213.   XtMoveWidget   (w_Buttons, (Position) ((int) na.pixmap.w + s_hor + b_hor),
  1214.                   (Position) b_ver) ;
  1215.  
  1216.   NA_RedrawPixmap () ;
  1217.   NA_ShowPixmap   () ;
  1218. }
  1219.  
  1220.  
  1221.  
  1222. /*****************************************************************************
  1223.   FUNCTION : NA_EventProc
  1224.  
  1225.   PURPOSE  : event handler 
  1226.   RETURNS  : void
  1227.   NOTES    :
  1228.  
  1229.   UPDATE   :
  1230. ******************************************************************************/
  1231.  
  1232. static void NA_EventProc (Widget w, Display *display, XEvent *event)
  1233.  
  1234. {
  1235.   switch (event->type)
  1236.   {
  1237.     case Expose: 
  1238.     {
  1239.       if (event->xexpose.count == 0) NA_ShowPixmap () ;
  1240.       break ;
  1241.     }
  1242.  
  1243.     case ConfigureNotify:
  1244.     {
  1245.       XFreePixmap (na_Display, na_Pixmap) ;
  1246.       NA_ResizeWindow () ;
  1247.       break ;
  1248.     }    
  1249.   }
  1250. }
  1251.  
  1252.  
  1253.  
  1254. /*****************************************************************************
  1255.   FUNCTION : NA_ContinueTest 
  1256.  
  1257.   PURPOSE  : used to synchronize the execution of multiple test operations
  1258.   RETURNS  : 
  1259.   NOTES    :
  1260.  
  1261.   UPDATE   : 
  1262. ******************************************************************************/
  1263.  
  1264. Bool NA_ContinueTest (void)
  1265.  
  1266. {
  1267.   if (! NA_NetworkAnalyzerIsOpen ()) return (FALSE) ;
  1268.  
  1269.   if (--no_of_m_test > 0) return (TRUE) ; 
  1270.  
  1271.   NA_StopTest () ; 
  1272.   return (FALSE) ;
  1273. }
  1274.  
  1275.  
  1276.  
  1277. /*****************************************************************************
  1278.   FUNCTION : NA_StopTest 
  1279.  
  1280.   PURPOSE  : used to stop a m-test operation
  1281.   RETURNS  : void 
  1282.   NOTES    :
  1283.  
  1284.   UPDATE   : 
  1285. ******************************************************************************/
  1286.  
  1287. void NA_StopTest (void)
  1288.  
  1289. {
  1290.   if (NA_NetworkAnalyzerIsOpen ())
  1291.   {
  1292.     no_of_m_test  = 0 ;  
  1293.     ui_xSetToggleState (t_MTest, FALSE) ;
  1294.   }
  1295. }
  1296.  
  1297.  
  1298.  
  1299. /*****************************************************************************
  1300.   FUNCTION : NA_CallbackProc
  1301.  
  1302.   PURPOSE  : network analyzer callback function 
  1303.   RETURNS  : void 
  1304.   NOTES    :
  1305.  
  1306.   UPDATE   : 
  1307. ******************************************************************************/
  1308.  
  1309. static void NA_CallbackProc (Widget w, XtPointer client_data, 
  1310.                                        XtPointer call_data)
  1311.  
  1312. {
  1313.   if      (w == t_On) 
  1314.     na.toggles.on = ui_xGetToggleState (t_On) ;    
  1315.  
  1316.   else if (w == t_Line) 
  1317.     na.toggles.line = ui_xGetToggleState (t_Line) ;    
  1318.  
  1319.   else if (w == t_Grid)
  1320.   {
  1321.     if (na.toggles.grid = ui_xGetToggleState (t_Grid)) 
  1322.       NA_DrawGrid   () ;
  1323.     else           
  1324.       NA_ShowPixmap () ;
  1325.   }
  1326.  
  1327.   else if (w == b_Clear) NA_ClearGraph () ;
  1328.  
  1329.   else if (w == t_MTest)
  1330.   {
  1331.     if (ui_remoteIsCreated)
  1332.     {
  1333.       if (ui_xGetToggleState (t_MTest))
  1334.       {
  1335.         no_of_m_test = na.m_test ;
  1336.         ui_rem_testProc (NULL, NULL, NULL) ;
  1337.       }
  1338.       else
  1339.         ui_xSetToggleState (t_MTest, TRUE) ;
  1340.     }
  1341.     else
  1342.       ui_confirmOk ("remote panel not open") ;
  1343.   }
  1344.  
  1345.   else if (w == t_Record)
  1346.   {
  1347.     if (na.toggles.record = ui_xGetToggleState (t_Record)) 
  1348.       NA_OpenRecordFile  () ;
  1349.     else  
  1350.       NA_CloseRecordFile () ; 
  1351.   }
  1352.  
  1353.   else if (w == b_Done)
  1354.   {
  1355.     if (na.toggles.record) 
  1356.       ui_confirmOk ("Rec-file not closed !") ; 
  1357.     else 
  1358.     { 
  1359.       NA_StopTest () ;
  1360.  
  1361.       if (na_DisplayControlOpen != 0) 
  1362.       {
  1363.         XtDestroyWidget (w_DisplayControl) ;
  1364.         na_DisplayControlOpen = 0 ;
  1365.       }
  1366.  
  1367.       XFreePixmap (na_Display, na_Pixmap) ;
  1368.       XtDestroyWidget (w_NetworkAnalyzer) ; 
  1369.       na_Open = 0 ;
  1370.       na.toggles.on = FALSE ; 
  1371.     } 
  1372.   }
  1373.  
  1374.  
  1375.  
  1376.  
  1377. /*****************************************************************************
  1378.   FUNCTION : NA_CreateNetworkAnalyzerWidget
  1379.  
  1380.   PURPOSE  : creates the network analyzer widget
  1381.   RETURNS  : void 
  1382.   NOTES    :
  1383.  
  1384.   UPDATE   : 
  1385. ******************************************************************************/
  1386.  
  1387. static void NA_CreateNetworkAnalyzerWidget (void)
  1388.  
  1389.   Cardinal   n ; 
  1390.   Arg        args[15] ; 
  1391.   Widget     dummy ;
  1392.  
  1393.  
  1394.   n = 0;  
  1395.  
  1396.   w_NetworkAnalyzer = 
  1397.     XtCreatePopupShell ("Network Analyzer", topLevelShellWidgetClass,
  1398.                         ui_toplevel, args, n); 
  1399.  
  1400.   n = 0 ;
  1401.   XtSetArg (args[n], XtNheight   , (Dimension) na.window.h) ; n++ ;
  1402.   XtSetArg (args[n], XtNwidth    , (Dimension) na.window.w) ; n++ ;
  1403.   XtSetArg (args[n], XtNresizable, True                   ) ; n++ ;
  1404.  
  1405.   w_Window = 
  1406.   XtCreateManagedWidget ("form", formWidgetClass, w_NetworkAnalyzer, NULL, 0) ;
  1407.  
  1408.   n = 0 ;
  1409.   XtSetArg (args[n], XtNheight      , (Dimension) na.pixmap.h ) ; n++ ; 
  1410.   XtSetArg (args[n], XtNwidth       , (Dimension) na.pixmap.w ) ; n++ ;
  1411.   XtSetArg (args[n], XtNleft        , XtChainLeft             ) ; n++ ; 
  1412.   XtSetArg (args[n], XtNright       , XtChainLeft             ) ; n++ ; 
  1413.   XtSetArg (args[n], XtNtop         , XtChainTop              ) ; n++ ;
  1414.   XtSetArg (args[n], XtNbottom      , XtChainTop              ) ; n++ ;
  1415.   XtSetArg (args[n], XtNfromVert    , NULL                    ) ; n++ ; 
  1416.   XtSetArg (args[n], XtNresizable   , True                    ) ; n++ ;
  1417.   XtSetArg (args[n], XtNborderWidth , 0                       ) ; n++ ;
  1418.  
  1419.   w_Screen = 
  1420.     XtCreateManagedWidget("screen", formWidgetClass, w_Window, args, n) ;
  1421.  
  1422.   n = 0 ;
  1423.   XtSetArg (args[n], XtNfromVert    , NULL        ) ; n++ ; 
  1424.   XtSetArg (args[n], XtNfromHoriz   , w_Screen    ) ; n++ ; 
  1425.   XtSetArg (args[n], XtNleft        , XtChainLeft ) ; n++ ; 
  1426.   XtSetArg (args[n], XtNright       , XtChainLeft ) ; n++ ; 
  1427.   XtSetArg (args[n], XtNtop         , XtChainTop  ) ; n++ ;
  1428.   XtSetArg (args[n], XtNbottom      , XtChainTop  ) ; n++ ;
  1429.   XtSetArg (args[n], XtNresizable   , False       ) ; n++ ;
  1430.   XtSetArg (args[n], XtNborderWidth , 0           ) ; n++ ;
  1431.   XtSetArg (args[n], XtNvertDistance, 0           ) ; n++ ;
  1432.  
  1433.   w_Buttons = 
  1434.     XtCreateManagedWidget ("form", formWidgetClass, w_Window, args, n) ;
  1435.  
  1436.   t_On     = NA_CreateToggleItem ("on2"   , w_Buttons, NULL , NULL, NULL    ) ;
  1437.   t_Line   = NA_CreateToggleItem ("line"  , w_Buttons, NULL , NULL, t_On    ) ;
  1438.   t_Grid   = NA_CreateToggleItem ("grid"  , w_Buttons, NULL , NULL, t_Line  ) ;
  1439.   b_Clear  = NA_CreateButtonItem ("clear" , w_Buttons, NULL ,       t_Grid  ) ;
  1440.   dummy    = ui_xCreateLabelItem (" "     , w_Buttons, 6 * 8, NULL, b_Clear ) ;
  1441.   t_MTest  = NA_CreateToggleItem ("m_test", w_Buttons, NULL , NULL, dummy   ) ;
  1442.   dummy    = ui_xCreateLabelItem (" "     , w_Buttons, 6 * 8, NULL, t_MTest ) ;
  1443.   t_Record = NA_CreateToggleItem ("record", w_Buttons, NULL , NULL, dummy   ) ;
  1444.   dummy    = ui_xCreateLabelItem (" "     , w_Buttons, 6 * 8, NULL, t_Record) ;
  1445.   b_DCtrl  = NA_CreateButtonItem ("dctrl" , w_Buttons, NULL ,       dummy   ) ;
  1446.   b_Setup  = NA_CreateButtonItem ("setup" , w_Buttons, NULL ,       b_DCtrl ) ;
  1447.   b_Done   = NA_CreateButtonItem ("done2" , w_Buttons, NULL ,       b_Setup ) ;
  1448.  
  1449.   ui_xSetToggleState (t_On    , na.toggles.on    ) ; 
  1450.   ui_xSetToggleState (t_Line  , na.toggles.line  ) ; 
  1451.   ui_xSetToggleState (t_Grid  , na.toggles.grid  ) ; 
  1452.   ui_xSetToggleState (t_MTest , FALSE) ;
  1453.   ui_xSetToggleState (t_Record, na.toggles.record) ;
  1454.  
  1455.   XtAddCallback (t_On    , XtNcallback, (XtCallbackProc)NA_CallbackProc, NULL);
  1456.   XtAddCallback (t_Line  , XtNcallback, (XtCallbackProc)NA_CallbackProc, NULL);
  1457.   XtAddCallback (t_Grid  , XtNcallback, (XtCallbackProc)NA_CallbackProc, NULL);
  1458.   XtAddCallback (b_Clear , XtNcallback, (XtCallbackProc)NA_CallbackProc, NULL);
  1459.   XtAddCallback (t_MTest , XtNcallback, (XtCallbackProc)NA_CallbackProc, NULL);
  1460.   XtAddCallback (t_Record, XtNcallback, (XtCallbackProc)NA_CallbackProc, NULL);
  1461.   XtAddCallback (b_Setup , XtNcallback, (XtCallbackProc)NA_OpenSetup   , NULL);
  1462.   XtAddCallback (b_Done  , XtNcallback, (XtCallbackProc)NA_CallbackProc, NULL);
  1463.   XtAddCallback (b_DCtrl , XtNcallback, (XtCallbackProc)NA_OpenDisplayControl, 
  1464.                  NULL);
  1465.  
  1466.  
  1467.   XtAddEventHandler (w_Screen, ExposureMask, FALSE, 
  1468.                      (XtEventHandler) NA_EventProc, NULL) ;
  1469.  
  1470.   XtAddEventHandler (w_Window, StructureNotifyMask, FALSE, 
  1471.                      (XtEventHandler) NA_EventProc, NULL) ;
  1472.    
  1473.   ui_checkWindowPosition (w_NetworkAnalyzer);
  1474.   XtPopup (w_NetworkAnalyzer, XtGrabNone);
  1475.  
  1476.   if (na_FirstCall)
  1477.   {
  1478.     n = 0 ;
  1479.     XtSetArg    (args[n], XtNwidth , &na_Width ) ; n++ ;  
  1480.     XtSetArg    (args[n], XtNheight, &na_Height) ; n++ ;
  1481.     XtGetValues (w_NetworkAnalyzer, args, n) ;
  1482.   }
  1483.  
  1484.   n = 0 ;
  1485.   XtSetArg    (args[n], XtNminWidth , na_Width ) ; n++ ;  
  1486.   XtSetArg    (args[n], XtNminHeight, na_Height) ; n++ ;
  1487.   XtSetValues (w_NetworkAnalyzer, args, n) ;
  1488.  
  1489.   na_Display    = XtDisplay      (w_Screen) ; 
  1490.   na_Window     = XtWindow       (w_Screen) ;
  1491.   na_FontStruct = XLoadQueryFont (na_Display, "6x12") ;
  1492.   na_GC         = XCreateGC      (na_Display, na_Window, ZERO, NULL) ;
  1493.   na_Screen     = DefaultScreen  (na_Display) ;
  1494.   na_Depth      = DisplayPlanes  (na_Display, na_Screen) ;
  1495.  
  1496.   XSetFont (na_Display, na_GC, (*na_FontStruct).fid) ;
  1497.  
  1498.   XSetBackground (na_Display, na_GC, WhitePixel (na_Display, na_Screen)) ;
  1499.   XSetForeground (na_Display, na_GC, BlackPixel (na_Display, na_Screen)) ; 
  1500.  
  1501.   XSetGraphicsExposures (na_Display, na_GC, 0) ;
  1502.  
  1503.   NA_ResizeWindow () ;
  1504.   na_Open = 1 ;
  1505. }
  1506.  
  1507.  
  1508.  
  1509. /*****************************************************************************
  1510.   FUNCTION : NA_OpenNetworkAnalyzer
  1511.  
  1512.   PURPOSE  : opens the network analyzer widget
  1513.   RETURNS  : void
  1514.   NOTES    :
  1515.  
  1516.   UPDATE   : 
  1517. ******************************************************************************/
  1518.  
  1519. void NA_OpenNetworkAnalyzer (Widget w, 
  1520.                              XtPointer client_data, 
  1521.                              XtPointer call_data)
  1522.  
  1523. {
  1524.   if (na_Open == 0)
  1525.   {
  1526.     no_of_m_test = 0 ;
  1527.  
  1528.     if (na_FirstCall) NA_ResetNetworkAnalyzer () ;
  1529.  
  1530.     NA_CreateNetworkAnalyzerWidget () ;
  1531.     na_FirstCall = FALSE ;
  1532.     na_DisplayControlOpen = 0 ;
  1533.    } 
  1534.    else
  1535.      ui_confirmOk ("network analyzer already open !") ;
  1536. }
  1537.  
  1538.  
  1539.  
  1540. /*############################################################################
  1541.  
  1542.                       S E T U P      F U N C T I O N S 
  1543.  
  1544. ############################################################################*/
  1545.  
  1546.  
  1547. /*****************************************************************************
  1548.   FUNCTION : NA_SetupGetValues
  1549.  
  1550.   PURPOSE  : gets data from setup
  1551.   RETURNS  : void 
  1552.   NOTES    :
  1553.  
  1554.   UPDATE   :
  1555. ******************************************************************************/
  1556.  
  1557. static void NA_SetupGetValues (void)
  1558.  
  1559.   se.hor.grid  = ui_xIntFromAsciiWidget   (w_HorGrid) ;
  1560.   se.ver.min   = ui_xFloatFromAsciiWidget (w_VerMin ) ;  
  1561.   se.ver.max   = ui_xFloatFromAsciiWidget (w_VerMax ) ;  
  1562.   se.ver.grid  = ui_xIntFromAsciiWidget   (w_VerGrid) ;  
  1563.   se.m_test    = ui_xIntFromAsciiWidget   (w_MSteps ) ; 
  1564.   se.hor.min   = ui_xFloatFromAsciiWidget (w_HorMin)  ;
  1565.   se.hor.max   = ui_xFloatFromAsciiWidget (w_HorMax)  ;  
  1566.  
  1567.   if (se.graphtype == NA_GRAPH_XY)
  1568.   {
  1569.     se.hor.unit_no = ui_xIntFromAsciiWidget   (w_HorUnit) ;  
  1570.     se.hor.out     = ui_xGetToggleState       (t_HorOut)  ;
  1571.   }
  1572.   else
  1573.     se.period      = ui_xIntFromAsciiWidget   (w_Period)  ;
  1574.  
  1575.   if (se.graphtype == NA_GRAPH_TE)
  1576.   {
  1577.     if      (ui_xGetToggleState (t_Lin)) se.error = NA_ERROR_LIN ;
  1578.     else if (ui_xGetToggleState (t_Sqr)) se.error = NA_ERROR_SQR ;
  1579.     else                                 
  1580.     { 
  1581.       se.error      = NA_ERROR_SU  ;
  1582.       se.error_unit = ui_xIntFromAsciiWidget (w_Su) ;
  1583.     }
  1584.  
  1585.     se.ave = ui_xGetToggleState (t_Ave) ;
  1586.   }
  1587.   else 
  1588.   {
  1589.     se.ver.unit_no = ui_xIntFromAsciiWidget (w_VerUnit) ;  
  1590.     se.ver.out     = ui_xGetToggleState     (t_VerOut ) ;
  1591.   }
  1592.  
  1593.   if (!na.toggles.record) 
  1594.     ui_xStringFromAsciiWidget (w_RecFile, se.rec_filename, 30) ; 
  1595. }
  1596.  
  1597.  
  1598.  
  1599. /*****************************************************************************
  1600.   FUNCTION : NA_SetupCheckValues
  1601.  
  1602.   PURPOSE  : checks the new values
  1603.   RETURNS  : void 
  1604.   NOTES    :
  1605.  
  1606.   UPDATE   :
  1607. ******************************************************************************/
  1608.  
  1609. static Bool NA_SetupCheckValues (void)
  1610.  
  1611. {
  1612.   struct Unit *unit_ptr ;
  1613.  
  1614.  
  1615.   if (se.hor.grid < 0)           se.hor.grid = 0 ;
  1616.   if (se.hor.grid > na.graph.w)  se.hor.grid = na.graph.w ;
  1617.  
  1618.   if (se.ver.grid < 0)           se.ver.grid = 0 ;
  1619.   if (se.ver.grid > na.graph.h)  se.ver.grid = na.graph.h ;
  1620.  
  1621.   if (se.m_test  < 1) se.m_test  = 1 ;
  1622.   if (se.period  < 1) se.period  = 1 ;
  1623.  
  1624.   if (se.hor.min >= se.hor.max) 
  1625.   {
  1626.     ui_confirmOk (" x : min has to be less than max") ;
  1627.     return (False) ;
  1628.   }
  1629.  
  1630.   if (se.ver.min >= se.ver.max)
  1631.   {
  1632.     ui_confirmOk (" y : min has to be less than max") ;
  1633.     return (False) ;
  1634.   }
  1635.  
  1636.   if (se.graphtype == NA_GRAPH_XY)
  1637.   {
  1638.     if ((se.hor.unit_no < 1) || (se.hor.unit_no > krui_getNoOfUnits()))
  1639.     {
  1640.       ui_confirmOk ("x : illegal unit no.") ; 
  1641.       return (False) ;
  1642.     }
  1643.   }
  1644.  
  1645.   if (se.graphtype != NA_GRAPH_TE)
  1646.   {
  1647.     if ((se.ver.unit_no < 1) || (se.ver.unit_no > krui_getNoOfUnits()))
  1648.     {
  1649.       ui_confirmOk ("y : illegal unit no.") ; 
  1650.       return (False) ;
  1651.     }
  1652.   }
  1653.   else  
  1654.   {
  1655.     if (se.error == NA_ERROR_SU)
  1656.     {
  1657.       if ((unit_ptr = kr_getUnitPtr (se.error_unit)) == NULL) 
  1658.       {
  1659.         ui_confirmOk ("unit j : illegal output unit no.") ;
  1660.         return (False) ;
  1661.       }
  1662.  
  1663.       if (! IS_OUTPUT_UNIT (unit_ptr))
  1664.       {
  1665.         ui_confirmOk ("unit j : illegal output unit no.") ;
  1666.         return (False) ;
  1667.       }
  1668.     }
  1669.   }
  1670.  
  1671.   return (True) ;
  1672. }
  1673.  
  1674.  
  1675.  
  1676. /*****************************************************************************
  1677.   FUNCTION : NA_SetupSetValues
  1678.  
  1679.   PURPOSE  : sets the new values 
  1680.   RETURNS  : void 
  1681.   NOTES    :
  1682.  
  1683.   UPDATE   :
  1684. ******************************************************************************/
  1685.  
  1686. static void NA_SetupSetValues (void)
  1687.  
  1688. {
  1689.   if (se.graphtype != na.graphtype) NA_ClearGraph () ;
  1690.  
  1691.   na.graphtype     = se.graphtype  ;
  1692.   na.error         = se.error      ;
  1693.   na.error_unit    = se.error_unit ;
  1694.   na.ave           = se.ave        ;
  1695.   na.m_test        = se.m_test     ;
  1696.   na.period        = se.period     ;
  1697.   na.gd.time       = se.period     ;
  1698.  
  1699.   na.hor.min       = se.hor.min     ;
  1700.   na.hor.max       = se.hor.max     ;
  1701.   na.hor.unit_no   = se.hor.unit_no ;
  1702.   na.hor.grid      = se.hor.grid    ;
  1703.   na.hor.out       = se.hor.out     ;
  1704.  
  1705.   na.ver.min       = se.ver.min     ;
  1706.   na.ver.max       = se.ver.max     ;
  1707.   na.ver.unit_no   = se.ver.unit_no ;
  1708.   na.ver.grid      = se.ver.grid    ;
  1709.   na.ver.out       = se.ver.out     ;
  1710.  
  1711.   strcpy (na.rec_filename, se.rec_filename) ;
  1712.  
  1713.   na.hor.factor    = (float) (na.graph.w) / (na.hor.max - na.hor.min) ;
  1714.   na.ver.factor    = (float) (na.graph.h) / (na.ver.max - na.ver.min) ;
  1715.  
  1716. }
  1717.  
  1718.  
  1719.  
  1720. /*****************************************************************************
  1721.   FUNCTION : NA_SetupCallbackProc
  1722.  
  1723.   PURPOSE  : setup callback function  
  1724.   RETURNS  : void 
  1725.   NOTES    :
  1726.  
  1727.   UPDATE   : 
  1728. ******************************************************************************/
  1729.  
  1730. static void NA_SetupCallbackProc (Widget w, 
  1731.                                   XtPointer client_data, 
  1732.                                   XtPointer call_data)
  1733.  
  1734. {
  1735.   if      (w == t_XY)
  1736.   {
  1737.     if (ui_xGetToggleState (t_XY))
  1738.     {
  1739.       ui_xSetToggleState   (t_TY, False) ; 
  1740.       ui_xSetToggleState   (t_TE, False) ;
  1741.       NA_SetupGetValues    ()            ;
  1742. /*      NA_CreateSetupWidget (NA_GRAPH_XY) ; */
  1743.       XtDestroyWidget (w_Setup) ;
  1744.       XtDestroyWidget (w_box)   ;
  1745.       na.graphtype = NA_GRAPH_XY;
  1746.       NA_OpenSetup (w, client_data, call_data);
  1747.     }
  1748.     else 
  1749.       ui_xSetToggleState (t_XY, True) ;
  1750.   }
  1751.  
  1752.   else if (w == t_TY)
  1753.   {  
  1754.     if (ui_xGetToggleState (t_TY))
  1755.     {
  1756.       ui_xSetToggleState   (t_XY, False) ; 
  1757.       ui_xSetToggleState   (t_TE, False) ; 
  1758.       NA_SetupGetValues    ()            ;
  1759. /*      NA_CreateSetupWidget (NA_GRAPH_TY) ; */
  1760.       XtDestroyWidget (w_Setup) ;
  1761.       XtDestroyWidget (w_box)   ;
  1762.       na.graphtype =  NA_GRAPH_TY;
  1763.       NA_OpenSetup (w, client_data, call_data);
  1764.     }
  1765.     else 
  1766.       ui_xSetToggleState (t_TY, True) ;
  1767.   }
  1768.  
  1769.   else if (w == t_TE)
  1770.   {  
  1771.     if (ui_xGetToggleState (t_TE))
  1772.     {
  1773.       ui_xSetToggleState   (t_XY, False) ; 
  1774.       ui_xSetToggleState   (t_TY, False) ;
  1775.       NA_SetupGetValues    ()            ;
  1776. /*      NA_CreateSetupWidget (NA_GRAPH_TE) ; */
  1777.       XtDestroyWidget (w_Setup) ;
  1778.       XtDestroyWidget (w_box)   ;
  1779.       na.graphtype =  NA_GRAPH_TE;
  1780.       NA_OpenSetup (w, client_data, call_data);
  1781.     }
  1782.     else 
  1783.       ui_xSetToggleState (t_TE, True) ;
  1784.   }
  1785.  
  1786.   else if (w == t_HorOut)
  1787.   {
  1788.     if (ui_xGetToggleState (t_HorOut)) ui_xSetToggleState (t_HorAct, False) ;
  1789.     else                               ui_xSetToggleState (t_HorOut, True ) ;
  1790.   }
  1791.  
  1792.   else if (w == t_HorAct)
  1793.   {
  1794.     if (ui_xGetToggleState (t_HorAct)) ui_xSetToggleState (t_HorOut, False) ;
  1795.     else                               ui_xSetToggleState (t_HorAct, True ) ;
  1796.   }
  1797.  
  1798.   else if (w == t_VerOut)
  1799.   {
  1800.     if (ui_xGetToggleState (t_VerOut)) ui_xSetToggleState (t_VerAct, False) ;
  1801.     else                               ui_xSetToggleState (t_VerOut, True ) ;
  1802.   }
  1803.  
  1804.   else if (w == t_VerAct)
  1805.   {
  1806.     if (ui_xGetToggleState (t_VerAct)) ui_xSetToggleState (t_VerOut, False) ;
  1807.     else                               ui_xSetToggleState (t_VerAct, True ) ;
  1808.   }
  1809.  
  1810.   else if (w == t_Lin)
  1811.   {  
  1812.     if (ui_xGetToggleState (t_Lin))
  1813.     {
  1814.       ui_xSetToggleState (t_Sqr, False) ; 
  1815.       ui_xSetToggleState (t_Su , False) ; 
  1816.     }
  1817.     else                               
  1818.       ui_xSetToggleState (t_Lin, True ) ;
  1819.   }
  1820.  
  1821.   else if (w == t_Sqr)
  1822.   {  
  1823.     if (ui_xGetToggleState (t_Sqr)) 
  1824.     {
  1825.       ui_xSetToggleState (t_Lin, False) ; 
  1826.       ui_xSetToggleState (t_Su , False) ; 
  1827.     }
  1828.     else                               
  1829.       ui_xSetToggleState (t_Sqr, True ) ;
  1830.   }
  1831.  
  1832.   else if (w == t_Su)
  1833.   {  
  1834.     if (ui_xGetToggleState (t_Su)) 
  1835.     {
  1836.       ui_xSetToggleState (t_Lin, False) ; 
  1837.       ui_xSetToggleState (t_Sqr, False) ; 
  1838.     }
  1839.     else                               
  1840.       ui_xSetToggleState (t_Su , True ) ;
  1841.   }
  1842.  
  1843.   else if (w == b_Cancel) XtDestroyWidget (w_Setup) ;
  1844.  
  1845.   else if (w == b_DoneS)
  1846.   { 
  1847.     NA_SetupGetValues () ;
  1848.     
  1849.     if (NA_SetupCheckValues ())
  1850.     {
  1851.       NA_SetupSetValues () ;
  1852.       NA_RedrawPixmap   () ;
  1853.       NA_ShowPixmap     () ;
  1854.       XtDestroyWidget   (w_Setup) ;
  1855.     }
  1856.   }
  1857.  
  1858. }
  1859.  
  1860.  
  1861.  
  1862. /*****************************************************************************
  1863.   FUNCTION : NA_CreateSetupWidget
  1864.  
  1865.   PURPOSE  : creates the setup widget 
  1866.   RETURNS  : void 
  1867.   NOTES    :
  1868.  
  1869.   UPDATE   :
  1870. ******************************************************************************/
  1871.  
  1872. static void NA_CreateSetupWidget (int graphtype)
  1873.  
  1874. {
  1875.   Widget     w_OldSetup, w_form[10] ;
  1876.   Widget     w_top, w_left, dummy ;
  1877.  
  1878.   Cardinal   n, f ;
  1879.   Arg        args[15] ;
  1880.   Position   setup_x, setup_y ;
  1881.   Dimension  width, height, max_width ;
  1882.  
  1883.   char       buf[80] ;
  1884.  
  1885.  
  1886.   w_OldSetup = w_Setup ;
  1887.  
  1888.   if (w_OldSetup == NULL)
  1889.   {
  1890.     XtTranslateCoords (b_Setup, 20, 8, &setup_x, &setup_y) ;
  1891.  
  1892.     n = 0;
  1893.     XtSetArg (args[n], XtNx        , setup_x      ) ; n++ ;
  1894.     XtSetArg (args[n], XtNy        , setup_y      ) ; n++ ;
  1895.  
  1896.     w_Setup = XtCreatePopupShell    ("Network Analyzer Setup", 
  1897.                                      transientShellWidgetClass, 
  1898.                                      ui_toplevel, args, n) ;
  1899.  
  1900.   }
  1901.   else
  1902.   {
  1903.     XtUnmapWidget   (w_Setup) ;
  1904.     XtDestroyWidget (w_box)   ;
  1905.   }
  1906.  
  1907.   se.graphtype = graphtype ;
  1908.   
  1909.   n = 0 ;
  1910.  
  1911.   w_box   = XtCreateManagedWidget ("box", boxWidgetClass, w_Setup, args, n) ;
  1912.  
  1913.  
  1914.   f = 0 ;
  1915.   n = 0 ;
  1916.  
  1917.   XtSetArg (args[n], XtNwidth , 10) ; n++ ; 
  1918.   XtSetArg (args[n], XtNheight, 10) ; n++ ;
  1919.  
  1920.  
  1921.   /* ---------------------------  setup part 1  ---------------------------- */
  1922.  
  1923.   w_form[f] = XtCreateManagedWidget ("form", formWidgetClass, w_box, args, n) ;
  1924.  
  1925.   dummy = ui_xCreateLabelItem ("graph :", w_form[f], 10 * 8, NULL , NULL) ;
  1926.   t_XY  = NA_CreateToggleItem ("xy"     , w_form[f], NULL  , dummy, NULL) ;
  1927.   dummy = ui_xCreateLabelItem ("  "     , w_form[f],  2 * 8, t_XY , NULL) ;
  1928.   t_TY  = NA_CreateToggleItem ("ty"     , w_form[f], NULL  , dummy, NULL) ;
  1929.   dummy = ui_xCreateLabelItem ("  "     , w_form[f],  2 * 8, t_TY , NULL) ;
  1930.   t_TE  = NA_CreateToggleItem ("te"     , w_form[f], NULL  , dummy, NULL) ;
  1931.  
  1932.   ui_xSetToggleState (t_XY, se.graphtype == NA_GRAPH_XY) ; 
  1933.   ui_xSetToggleState (t_TY, se.graphtype == NA_GRAPH_TY) ;
  1934.   ui_xSetToggleState (t_TE, se.graphtype == NA_GRAPH_TE) ; 
  1935.  
  1936.   XtAddCallback 
  1937.     (t_XY, XtNcallback, (XtCallbackProc) NA_SetupCallbackProc, NULL) ;
  1938.   XtAddCallback 
  1939.     (t_TY, XtNcallback, (XtCallbackProc) NA_SetupCallbackProc, NULL) ;
  1940.   XtAddCallback 
  1941.     (t_TE, XtNcallback, (XtCallbackProc) NA_SetupCallbackProc, NULL) ;
  1942.  
  1943.   f++ ;
  1944.  
  1945.  
  1946.   /* ---------------------------  setup part 2  ---------------------------- */
  1947.  
  1948.   w_form[f] = XtCreateManagedWidget ("form", formWidgetClass, w_box, args, n) ;
  1949.  
  1950.   strcpy (buf, "axis    min     max    unit   grid") ;
  1951.  
  1952.   w_top  = ui_xCreateLabelItem (buf, w_form[f], 33 * 8 - 6, NULL, NULL ) ;
  1953.  
  1954.   if (se.graphtype == NA_GRAPH_XY) strcpy (buf, " x ") ;
  1955.   else                             strcpy (buf, " t ") ;
  1956.  
  1957.   w_left = ui_xCreateLabelItem (buf, w_form[f], 5 * 8, NULL, w_top) ;
  1958.  
  1959.   sprintf (buf, "%5.3f", se.hor.min) ;
  1960.   w_HorMin  = w_left =
  1961.     ui_xCreateDialogItem (" ", w_form[f], buf,  6 * 8, w_left, w_top) ;
  1962.  
  1963.   sprintf (buf, "%5.3f", se.hor.max) ;
  1964.   w_HorMax  = w_left =
  1965.     ui_xCreateDialogItem (" ", w_form[f], buf,  6 * 8, w_left, w_top) ;
  1966.  
  1967.   if (se.graphtype == NA_GRAPH_XY)
  1968.   {
  1969.     sprintf (buf, "%d", se.hor.unit_no) ;
  1970.     w_HorUnit = w_left =
  1971.       ui_xCreateDialogItem (" ", w_form[f], buf,  6 * 8, w_left, w_top) ;
  1972.   }
  1973.   else
  1974.     w_left =
  1975.       ui_xCreateLabelItem  (" ", w_form[f],   2 + 6 * 8, w_left, w_top) ;
  1976.  
  1977.   sprintf (buf, "%d", se.hor.grid) ;
  1978.   w_HorGrid  = w_top =
  1979.       ui_xCreateDialogItem (" ", w_form[f], buf,  6 * 8, w_left, w_top) ;
  1980.  
  1981.   if (se.graphtype == NA_GRAPH_TE) strcpy (buf, " e ") ;
  1982.   else                             strcpy (buf, " y ") ;
  1983.  
  1984.   w_left  =
  1985.       ui_xCreateLabelItem  (buf, w_form[f],       5 * 8, NULL  , w_top) ;
  1986.  
  1987.   sprintf (buf, "%5.3f", se.ver.min) ;
  1988.   w_VerMin  = w_left =
  1989.       ui_xCreateDialogItem (" ", w_form[f], buf,  6 * 8, w_left, w_top) ;
  1990.  
  1991.   sprintf (buf, "%5.3f", se.ver.max) ;
  1992.   w_VerMax  = w_left =
  1993.       ui_xCreateDialogItem (" ", w_form[f], buf,  6 * 8, w_left, w_top) ;
  1994.  
  1995.   if (se.graphtype != NA_GRAPH_TE)
  1996.   {
  1997.     sprintf (buf, "%d", se.ver.unit_no) ;
  1998.     w_VerUnit  = w_left =
  1999.       ui_xCreateDialogItem (" ", w_form[f], buf,  6 * 8, w_left, w_top) ;
  2000.   }
  2001.   else
  2002.     w_left =
  2003.       ui_xCreateLabelItem  (" ", w_form[f],   6 * 8 + 2, w_left, w_top) ;
  2004.  
  2005.   sprintf (buf, "%d", se.ver.grid) ;
  2006.   w_VerGrid  = w_left =
  2007.       ui_xCreateDialogItem (" ", w_form[f], buf,  6 * 8, w_left, w_top) ;
  2008.  
  2009.   f++ ;
  2010.  
  2011.  
  2012.   /* ---------------------------  setup part 3  ---------------------------- */
  2013.  
  2014.   w_form[f] = XtCreateManagedWidget ("form", formWidgetClass, w_box, args, n) ;
  2015.  
  2016.   w_top = NULL ;
  2017.  
  2018.   if (se.graphtype == NA_GRAPH_XY)
  2019.   {
  2020.     dummy    = ui_xCreateLabelItem ("x unit :", w_form[f], 10*8, NULL, w_top) ;
  2021.     t_HorOut = NA_CreateToggleItem ("out", w_form[f], NULL, dummy    , w_top) ;
  2022.     dummy    = ui_xCreateLabelItem ("  " , w_form[f], 2*8 , t_HorOut , w_top) ;
  2023.     t_HorAct = NA_CreateToggleItem ("act", w_form[f], NULL, dummy    , w_top) ;
  2024.  
  2025.     ui_xSetToggleState (t_HorOut,  se.hor.out) ;
  2026.     ui_xSetToggleState (t_HorAct, !se.hor.out) ;
  2027.  
  2028.     XtAddCallback 
  2029.       (t_HorOut, XtNcallback, (XtCallbackProc) NA_SetupCallbackProc, NULL) ;
  2030.     XtAddCallback 
  2031.       (t_HorAct, XtNcallback, (XtCallbackProc) NA_SetupCallbackProc, NULL) ;
  2032.  
  2033.     w_top = dummy ;
  2034.   }
  2035.  
  2036.   if (se.graphtype != NA_GRAPH_TE) 
  2037.   {
  2038.     dummy    = ui_xCreateLabelItem ("y unit :", w_form[f], 10*8, NULL, w_top) ;
  2039.     t_VerOut = NA_CreateToggleItem ("out", w_form[f], NULL, dummy    , w_top) ;
  2040.     dummy    = ui_xCreateLabelItem ("  " , w_form[f], 2*8 , t_VerOut , w_top) ;
  2041.     t_VerAct = NA_CreateToggleItem ("act", w_form[f], NULL, dummy    , w_top) ;
  2042.  
  2043.     ui_xSetToggleState (t_VerOut,  se.ver.out) ;
  2044.     ui_xSetToggleState (t_VerAct, !se.ver.out) ;
  2045.  
  2046.     XtAddCallback 
  2047.       (t_VerOut, XtNcallback, (XtCallbackProc) NA_SetupCallbackProc, NULL) ;
  2048.     XtAddCallback 
  2049.       (t_VerAct, XtNcallback, (XtCallbackProc) NA_SetupCallbackProc, NULL) ;
  2050.   }
  2051.   else
  2052.   {
  2053.     dummy = ui_xCreateLabelItem ("error  :", w_form[f], 8 * 8, NULL , w_top) ;
  2054.     t_Lin = NA_CreateToggleItem ("e_lin"   , w_form[f], NULL , dummy, w_top) ;
  2055.     dummy = ui_xCreateLabelItem ("  "      , w_form[f], 1 * 8, t_Lin, w_top) ;
  2056.     t_Sqr = NA_CreateToggleItem ("e_sqr"   , w_form[f], NULL , dummy, w_top) ;
  2057.     dummy = ui_xCreateLabelItem ("  "      , w_form[f], 1 * 8, t_Sqr, w_top) ;
  2058.     t_Su  = NA_CreateToggleItem ("e_su"    , w_form[f], NULL , dummy, w_top) ;
  2059.  
  2060.     w_top = t_Lin ;
  2061.     sprintf (buf, "%d", se.error_unit) ;
  2062.  
  2063.     dummy = ui_xCreateLabelItem ("unit j :", w_form[f], 8 * 8, NULL , w_top) ;
  2064.     w_Su  = ui_xCreateDialogItem(" ",   w_form[f], buf, 6 * 8, dummy, w_top) ;
  2065.     dummy = ui_xCreateLabelItem ("  "      , w_form[f], 9*8+2, w_Su , w_top) ;
  2066.     t_Ave = NA_CreateToggleItem ("ave"     , w_form[f], NULL , dummy, w_top) ;
  2067.  
  2068.     ui_xSetToggleState (t_Lin, (se.error == NA_ERROR_LIN)) ;
  2069.     ui_xSetToggleState (t_Sqr, (se.error == NA_ERROR_SQR)) ;
  2070.     ui_xSetToggleState (t_Su , (se.error == NA_ERROR_SU )) ;
  2071.     ui_xSetToggleState (t_Ave,  se.ave) ;
  2072.  
  2073.     XtAddCallback 
  2074.       (t_Lin, XtNcallback, (XtCallbackProc) NA_SetupCallbackProc, NULL) ;
  2075.     XtAddCallback 
  2076.       (t_Sqr, XtNcallback, (XtCallbackProc) NA_SetupCallbackProc, NULL) ;
  2077.     XtAddCallback 
  2078.       (t_Su , XtNcallback, (XtCallbackProc) NA_SetupCallbackProc, NULL) ;
  2079.   }
  2080.  
  2081.   f++ ;
  2082.  
  2083.  
  2084.   /* ---------------------------  setup part 4  ---------------------------- */
  2085.  
  2086.   w_form[f] = XtCreateManagedWidget ("form", formWidgetClass, w_box, args, n) ;
  2087.  
  2088.   w_left = w_top =
  2089.     ui_xCreateLabelItem  ("m-test :", w_form[f], 8 * 8, NULL  , NULL) ;
  2090.  
  2091.   sprintf (buf, "%d", se.m_test) ;
  2092.   w_MSteps = ui_xCreateDialogItem (" ", w_form[f], buf, 6 * 8, w_left, NULL) ;
  2093.  
  2094.  
  2095.   if (se.graphtype != NA_GRAPH_XY)
  2096.   {
  2097.     w_left =                              
  2098.       ui_xCreateLabelItem ("time   :", w_form[f], 8 * 8, NULL , w_top) ;
  2099.  
  2100.     sprintf (buf, "%d", se.period) ;
  2101.       w_Period =
  2102.         ui_xCreateDialogItem (" ", w_form[f], buf, 6 * 8, w_left   , w_top) ;
  2103.   }
  2104.  
  2105.   f++ ;
  2106.  
  2107.  
  2108.   /* ---------------------------  setup part 5  ---------------------------- */
  2109.  
  2110.   w_form[f] = XtCreateManagedWidget ("form", formWidgetClass, w_box, args, n) ;
  2111.  
  2112.   dummy =
  2113.       ui_xCreateLabelItem  ("record file :", w_form[f], 14 * 8, NULL, NULL) ;
  2114.  
  2115.   if (na.toggles.record)
  2116.     dummy = 
  2117.       ui_xCreateLabelItem  (se.rec_filename, w_form[f], 32 * 8, NULL, dummy) ;
  2118.   else
  2119.     w_RecFile =
  2120.       ui_xCreateDialogItem (" ", w_form[f], se.rec_filename, 32 * 8, NULL, 
  2121.                             dummy) ;
  2122.  
  2123.   f++ ;
  2124.  
  2125.  
  2126.   /* ---------------------------  setup part 6  ---------------------------- */
  2127.  
  2128.   if (f > 0) w_top = w_form[f-1] ;
  2129.   else       w_top = NULL ;
  2130.  
  2131.   b_DoneS  = NA_CreateButtonItem ("done2" , w_box, NULL   , w_top) ;
  2132.   b_Cancel = NA_CreateButtonItem ("cancel", w_box, b_DoneS, w_top) ;
  2133.  
  2134.   XtAddCallback 
  2135.     (b_DoneS , XtNcallback, (XtCallbackProc) NA_SetupCallbackProc, NULL) ;
  2136.  
  2137.   XtAddCallback 
  2138.     (b_Cancel, XtNcallback, (XtCallbackProc) NA_SetupCallbackProc, NULL) ;
  2139.  
  2140.  
  2141.   /* ---------------  popup new setup, destroy old setup  ------------------ */
  2142.  
  2143.   if (w_OldSetup == NULL){
  2144.       ui_checkWindowPosition (w_Setup);
  2145.       XtPopup (w_Setup, XtGrabExclusive) ;
  2146.   }
  2147.  
  2148.   XtMapWidget (w_Setup) ;
  2149.  
  2150.  
  2151.   /* ------------------------  resize widgets  ----------------------------- */
  2152.  
  2153.   max_width = 0 ;
  2154.  
  2155.   for (n = 0 ; n < f ; n++)
  2156.   {
  2157.     XtSetArg    (args[0]  , XtNwidth, &width) ;
  2158.     XtGetValues (w_form[n], args    ,  1    ) ;
  2159.  
  2160.     if (width > max_width) max_width = width ;
  2161.   }
  2162.  
  2163.   for (n = 0 ; n < f ; n++)
  2164.   {
  2165.     XtSetArg    (args[0]  , XtNwidth,  width) ;
  2166.     XtSetValues (w_form[n], args    ,  1    ) ;
  2167.   }
  2168.  
  2169. /*
  2170.   n = 0 ;
  2171.   XtSetArg    (args[n], XtNwidth    , &width ) ; n++ ;
  2172.   XtSetArg    (args[n], XtNheight   , &height) ; n++ ;
  2173.   XtGetValues (w_Setup, args        ,  n     ) ;
  2174.  
  2175.   n = 0 ;
  2176.   XtSetArg    (args[n], XtNminWidth ,  width ) ; n++ ;
  2177.   XtSetArg    (args[n], XtNminHeight,  height) ; n++ ;
  2178.   XtSetArg    (args[n], XtNmaxWidth ,  width ) ; n++ ;
  2179.   XtSetArg    (args[n], XtNmaxHeight,  height) ; n++ ;
  2180.   XtSetValues (w_Setup, args        ,  n     ) ;
  2181. */
  2182. }
  2183.  
  2184.  
  2185.  
  2186. /*****************************************************************************
  2187.   FUNCTION : NA_OpenSetup
  2188.  
  2189.   PURPOSE  : gets the actual parameters and opens the setup widget
  2190.   RETURNS  : void 
  2191.   NOTES    :
  2192.  
  2193.   UPDATE   : 
  2194. ******************************************************************************/
  2195.  
  2196. static void NA_OpenSetup (Widget w, 
  2197.                           XtPointer client_data,
  2198.                           XtPointer call_data)
  2199.  
  2200. {
  2201.   se.hor.min     = na.hor.min     ;
  2202.   se.hor.max     = na.hor.max     ;
  2203.   se.hor.factor  = na.hor.factor  ;
  2204.   se.hor.unit_no = na.hor.unit_no ;
  2205.   se.hor.grid    = na.hor.grid    ;
  2206.   se.hor.out     = na.hor.out     ;
  2207.  
  2208.   se.ver.min     = na.ver.min     ;
  2209.   se.ver.max     = na.ver.max     ;
  2210.   se.ver.factor  = na.ver.factor  ;
  2211.   se.ver.unit_no = na.ver.unit_no ;
  2212.   se.ver.grid    = na.ver.grid    ;
  2213.   se.ver.out     = na.ver.out     ;
  2214.  
  2215.   se.error       = na.error       ;
  2216.   se.error_unit  = na.error_unit  ;
  2217.   se.ave         = na.ave         ;
  2218.   se.period      = na.gd.time     ;
  2219.   se.m_test      = na.m_test      ;
  2220.  
  2221.   strcpy (se.rec_filename, na.rec_filename) ;
  2222.  
  2223.   w_Setup = NULL ;
  2224.  
  2225.   NA_CreateSetupWidget (na.graphtype) ;
  2226. }
  2227.  
  2228.  
  2229.  
  2230. /*****************************************************************************
  2231.   FUNCTION : NA_DControlCallbackProc
  2232.  
  2233.   PURPOSE  : display control callback function  
  2234.   RETURNS  : void 
  2235.   NOTES    :
  2236.  
  2237.   UPDATE   : 
  2238. ******************************************************************************/
  2239.  
  2240. static void NA_DControlCallbackProc (Widget w, 
  2241.                                      XtPointer client_data, 
  2242.                                      XtPointer call_data)
  2243.  
  2244. {
  2245.   float new_value ;
  2246.  
  2247.  
  2248.   if      (w == b_HorHalf)
  2249.   {  
  2250.     new_value = na.hor.min + (na.hor.max - na.hor.min) / 2 ;     
  2251.     if (na.hor.min < new_value) na.hor.max = new_value ;
  2252.   }
  2253.  
  2254.   else if (w == b_HorDouble)
  2255.   {
  2256.     new_value = na.hor.min + (na.hor.max - na.hor.min) * 2 ;     
  2257.     if (na.hor.min < new_value) na.hor.max = new_value ;
  2258.   } 
  2259.  
  2260.   else if (w == b_HorLeft)
  2261.   {
  2262.     new_value  = (na.hor.max - na.hor.min) / (float) na.hor.grid ;
  2263.     na.hor.min = na.hor.min - new_value ;
  2264.     na.hor.max = na.hor.max - new_value ;
  2265.   } 
  2266.  
  2267.   else if (w == b_HorLLeft)
  2268.   {
  2269.     new_value  = na.hor.max - na.hor.min ;
  2270.     na.hor.min = na.hor.min - new_value ;
  2271.     na.hor.max = na.hor.max - new_value ;
  2272.   } 
  2273.  
  2274.   else if (w == b_HorRight)
  2275.   {
  2276.     new_value  = (na.hor.max - na.hor.min) / (float) na.hor.grid ;
  2277.     na.hor.min = na.hor.min + new_value ;
  2278.     na.hor.max = na.hor.max + new_value ;
  2279.   } 
  2280.  
  2281.   else if (w == b_HorRRight)
  2282.   {
  2283.     new_value  = na.hor.max - na.hor.min ;
  2284.     na.hor.min = na.hor.min + new_value ;
  2285.     na.hor.max = na.hor.max + new_value ;
  2286.   } 
  2287.  
  2288.   else if (w == b_VerHalf)
  2289.   {
  2290.     new_value = na.ver.min + (na.ver.max - na.ver.min) / 2 ;     
  2291.     if (na.ver.min < new_value) na.ver.max = new_value ;
  2292.   } 
  2293.  
  2294.   else if (w == b_VerDouble)
  2295.   {
  2296.     new_value = na.ver.min + (na.ver.max - na.ver.min) * 2 ;     
  2297.     if (na.ver.min < new_value) na.ver.max = new_value ;
  2298.   } 
  2299.  
  2300.   else if (w == b_VerUp)
  2301.   {
  2302.     new_value  = (na.ver.max - na.ver.min) / (float) na.ver.grid ;
  2303.     na.ver.min = na.ver.min + new_value ;
  2304.     na.ver.max = na.ver.max + new_value ;
  2305.   } 
  2306.  
  2307.   else if (w == b_VerUUp)
  2308.   {
  2309.     new_value  = na.ver.max - na.ver.min ;
  2310.     na.ver.min = na.ver.min + new_value ;
  2311.     na.ver.max = na.ver.max + new_value ;
  2312.   } 
  2313.  
  2314.   else if (w == b_VerDown)
  2315.   {
  2316.     new_value  = (na.ver.max - na.ver.min) / (float) na.ver.grid ;
  2317.     na.ver.min = na.ver.min - new_value ;
  2318.     na.ver.max = na.ver.max - new_value ;
  2319.   } 
  2320.  
  2321.   else if (w == b_VerDDown)
  2322.   {
  2323.     new_value  = na.ver.max - na.ver.min ;
  2324.     na.ver.min = na.ver.min - new_value ;
  2325.     na.ver.max = na.ver.max - new_value ;
  2326.   } 
  2327.  
  2328.   else if (w == b_DoneDC)
  2329.   {
  2330.     XtDestroyWidget (w_DisplayControl) ;
  2331.     na_DisplayControlOpen = 0 ; 
  2332.     return ;
  2333.   } 
  2334.  
  2335.   na.hor.factor = (float) na.graph.w / (float) (na.hor.max - na.hor.min) ;
  2336.   na.ver.factor = (float) na.graph.h / (float) (na.ver.max - na.ver.min) ;
  2337.  
  2338.   NA_RedrawPixmap () ;
  2339.   NA_ShowPixmap   () ;
  2340. }
  2341.  
  2342.  
  2343. /*****************************************************************************
  2344.   FUNCTION : NA_OpenDisplayControl
  2345.  
  2346.   PURPOSE  : open network analyzer display control window 
  2347.   RETURNS  : void 
  2348.   NOTES    :
  2349.  
  2350.   UPDATE   : 
  2351. ******************************************************************************/
  2352.  
  2353. static void NA_OpenDisplayControl (Widget w, 
  2354.                                    XtPointer client_data, 
  2355.                                    XtPointer call_data)
  2356.  
  2357. {
  2358.   Widget     w_box, w_form, w_dummy, w_top ;
  2359.   Dimension  width, height ;
  2360.   Cardinal   n  ;
  2361.   Arg        args[15] ;
  2362.  
  2363.  
  2364.   if (na_DisplayControlOpen != 0) return ;
  2365.  
  2366.   w_DisplayControl = 
  2367.     XtCreatePopupShell ("NA Display Control", 
  2368.                         topLevelShellWidgetClass, ui_toplevel, NULL, 0) ;
  2369.  
  2370.   w_box  =
  2371.     XtCreateManagedWidget ("box" , boxWidgetClass, w_DisplayControl, NULL, 0) ;
  2372.  
  2373.   w_form = XtCreateManagedWidget ("form", formWidgetClass, w_box, NULL, 0) ;
  2374.   w_top  = NULL ;
  2375.  
  2376.   w_dummy     = ui_xCreateLabelItem ("hor.: ", w_form, 6 * 8, NULL, w_top) ;
  2377.   b_HorHalf   = NA_CreateButtonItem ("half"  , w_form, w_dummy    , w_top) ;
  2378.   w_dummy     = ui_xCreateLabelItem (" ", w_form, 2*8, b_HorHalf  , w_top) ;
  2379.   b_HorLeft   = NA_CreateButtonItem ("left"  , w_form, w_dummy    , w_top) ;
  2380.   b_HorRight  = NA_CreateButtonItem ("right" , w_form, b_HorLeft , w_top) ;
  2381.   
  2382.   w_top = w_dummy ;
  2383.   w_dummy     = ui_xCreateLabelItem ("      ", w_form, 6 * 8, NULL, w_top) ;
  2384.   b_HorDouble = NA_CreateButtonItem ("double", w_form, w_dummy    , w_top) ;
  2385.   w_dummy     = ui_xCreateLabelItem (" ", w_form, 2*8, b_HorDouble, w_top) ;
  2386.   b_HorLLeft  = NA_CreateButtonItem ("lleft" , w_form, w_dummy    , w_top) ;
  2387.   b_HorRRight = NA_CreateButtonItem ("rright", w_form, b_HorLLeft , w_top) ;
  2388.  
  2389.   w_form = XtCreateManagedWidget ("form", formWidgetClass, w_box, NULL, 0) ;
  2390.   w_top  = NULL ;
  2391.  
  2392.   w_dummy     = ui_xCreateLabelItem ("ver.: ", w_form, 6 * 8, NULL, w_top) ;
  2393.   b_VerHalf   = NA_CreateButtonItem ("half"  , w_form, w_dummy    , w_top) ;
  2394.   w_dummy     = ui_xCreateLabelItem (" ", w_form, 2*8, b_VerHalf  , w_top) ;
  2395.   b_VerDown   = NA_CreateButtonItem ("down2" , w_form, w_dummy    , w_top) ;
  2396.   b_VerUp     = NA_CreateButtonItem ("up2"   , w_form, b_VerDown  , w_top) ;
  2397.   
  2398.   w_top = w_dummy ;
  2399.   w_dummy     = ui_xCreateLabelItem ("      ", w_form, 6 * 8, NULL, w_top) ;
  2400.   b_VerDouble = NA_CreateButtonItem ("double", w_form, w_dummy    , w_top) ;
  2401.   w_dummy     = ui_xCreateLabelItem (" ", w_form, 2*8, b_VerDouble, w_top) ;
  2402.   b_VerDDown  = NA_CreateButtonItem ("ddown" , w_form, w_dummy    , w_top) ;
  2403.   b_VerUUp    = NA_CreateButtonItem ("uup"   , w_form, b_VerDDown , w_top) ;
  2404.   
  2405.   b_DoneDC    = NA_CreateButtonItem ("done2" , w_box, NULL, w_form) ;
  2406.  
  2407.   XtAddCallback (b_HorHalf, XtNcallback, 
  2408.                  (XtCallbackProc) NA_DControlCallbackProc, NULL) ;
  2409.   XtAddCallback (b_HorDouble, XtNcallback, 
  2410.                  (XtCallbackProc) NA_DControlCallbackProc, NULL) ;
  2411.   XtAddCallback (b_HorLeft, XtNcallback, 
  2412.                  (XtCallbackProc) NA_DControlCallbackProc, NULL) ;
  2413.   XtAddCallback (b_HorLLeft, XtNcallback, 
  2414.                  (XtCallbackProc) NA_DControlCallbackProc, NULL) ;
  2415.   XtAddCallback (b_HorRight, XtNcallback, 
  2416.                  (XtCallbackProc) NA_DControlCallbackProc, NULL) ;
  2417.   XtAddCallback (b_HorRRight, XtNcallback, 
  2418.                  (XtCallbackProc) NA_DControlCallbackProc, NULL) ;
  2419.   XtAddCallback (b_VerHalf, XtNcallback, 
  2420.                  (XtCallbackProc) NA_DControlCallbackProc, NULL) ;
  2421.   XtAddCallback (b_VerDouble, XtNcallback, 
  2422.                  (XtCallbackProc) NA_DControlCallbackProc, NULL) ;
  2423.   XtAddCallback (b_VerUp, XtNcallback, 
  2424.                  (XtCallbackProc) NA_DControlCallbackProc, NULL) ;
  2425.   XtAddCallback (b_VerUUp, XtNcallback, 
  2426.                  (XtCallbackProc) NA_DControlCallbackProc, NULL) ;
  2427.   XtAddCallback (b_VerDown, XtNcallback, 
  2428.                  (XtCallbackProc) NA_DControlCallbackProc, NULL) ;
  2429.   XtAddCallback (b_VerDDown, XtNcallback, 
  2430.                  (XtCallbackProc) NA_DControlCallbackProc, NULL) ;
  2431.   XtAddCallback (b_DoneDC, XtNcallback, 
  2432.                  (XtCallbackProc) NA_DControlCallbackProc, NULL) ;
  2433.  
  2434.   ui_checkWindowPosition (w_DisplayControl);
  2435.   XtPopup (w_DisplayControl, XtGrabNone);
  2436.  
  2437.   n = 0 ;
  2438.   XtSetArg    (args[n], XtNwidth    , &width ) ; n++ ;
  2439.   XtSetArg    (args[n], XtNheight   , &height) ; n++ ;
  2440.   XtGetValues (w_DisplayControl, args, n) ;
  2441.  
  2442.   n = 0 ;
  2443.   XtSetArg    (args[n], XtNminWidth ,  width ) ; n++ ;
  2444.   XtSetArg    (args[n], XtNminHeight,  height) ; n++ ;
  2445.   XtSetArg    (args[n], XtNmaxWidth ,  width ) ; n++ ;
  2446.   XtSetArg    (args[n], XtNmaxHeight,  height) ; n++ ;
  2447.   XtSetValues (w_DisplayControl, args, n) ;
  2448.  
  2449.   na_DisplayControlOpen = 1 ;
  2450. }
  2451.  
  2452.  
  2453.  
  2454. /*****************************************************************************
  2455.                            E N D   O F   F I L E
  2456. ******************************************************************************/
  2457.  
  2458.  
  2459.  
  2460.